LeetCode第[84]题(Java):Largest Rectangle in Histogram(最大的矩形柱状图)
题目:最大的矩形柱状图
难度:hard
题目内容:
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
翻译:
给定n个非负整数表示直方图的杆高度,其中每个条的宽度为1,找出直方图中最大矩形的面积。

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

The largest rectangle is shown in the shaded area, which has area = 10 unit.
我的思路:对每个元素都向两边进行搜索,如果高度大于它面积就+它,最后取最大。
我的代码:
public int largestRectangleArea(int[] height) {
int max = 0;
for (int i = 0; i < height.length; i++) {
max = Math.max(max, getArea(height, i));
}
return max;
}
private int getArea(int[] height, int i) {
int area = height[i];
for (int j = i+1; j < height.length; j++) {
if (height[j] >= height[i]) {
area += height[i];
} else {
break;
}
}
for (int j = i-1; j > -1; j--) {
if (height[j] >= height[i]) {
area += height[i];
} else {
break;
}
}
return area;
}
我的复杂度:O(N2) 空间复杂度O(1)
编码过程中的问题:
1、之前只往后面搜索没有往前;
2、方法复杂度太高,须优化。
答案代码:
public int largestRectangleArea(int[] height) {
int len = height.length;
Stack<Integer> s = new Stack<Integer>();
int maxArea = 0;
for(int i = 0; i <= len; i++){
int h = (i == len ? 0 : height[i]);
if(s.isEmpty() || h >= height[s.peek()]){
s.push(i);
}else{
int tp = s.pop();
maxArea = Math.max(maxArea, height[tp] * (s.isEmpty() ? i : i - 1 - s.peek()));
i--;
}
}
return maxArea;
}
答案复杂度:O(N) 空间复杂度O(N)
答案思路:
思路理解了半天,表示很难想到,那就直接解释好了:
利用一个栈,“递增”的块则直接压入栈中,否则(停止递增时),则将栈顶出栈,乘以上一个比他矮的下标(也就是它出栈后的栈顶)与当前指针的高度,
这样就能表示当前指针的“前一个比它高的块”的最大面积,与最大值比较之后,需要将指针 i 再-1,用来继续探测当前指针“前一块比它高的”。(从下标0一直判断到length,当下标为length的时候,高度为0)
特殊情况:
出栈后,栈内已经为空的时候,说明从最开始(下标 0),到目前为止(下标 i 的前一个),最低点就是刚刚出栈的那一个。所以此时只需要直接用此高度乘以 i 即可(相当于出栈后的栈顶是 - 1)。
示例:【2,1,3,5】
下标 操作
0 栈内空,0入栈(注意,入栈的是下标,取出来比较的时候要写成height[stack.peek()])。此时栈内【0】
1 1比栈顶下标0所表示高度2小,下标0出栈,栈空(前面比2小的没了),所以 area = 2 * i = 2;此时栈内【空】
继续判断,栈空,1入栈。此时栈内【1】
2 3比栈顶1所示高度1大,下标2入栈。此时栈内【1,2】
3 5比栈顶2所示高度3大,下标3入栈。此时栈内【1,2,3】
4 0比栈顶3所示高度5小,下标3出栈,栈顶为2(前面比高度5矮的下标2的那个),所以 area = 5 * (4-2-1) = 5;此时栈内【1,2】
继续判断,0比栈顶2所示高度3小,下标2出栈,栈顶为1(前面比高度3矮的是的下标1的那个),所以 area = 3 * (4-1-1) = 6;此时栈内【1】
继续判断,0比栈顶1所示高度1小,下标1出栈,栈为空,所以 area = 1 * i = 4;此时栈内【空】
继续判断,栈空,0入栈。此时栈内【0】
综上取最大area =》 6
LeetCode第[84]题(Java):Largest Rectangle in Histogram(最大的矩形柱状图)的更多相关文章
- leetCode 84.Largest Rectangle in Histogram (最大矩形直方图) 解题思路和方法
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- 73.Largest Rectangle in Histogram(最大矩形)
Level: Hard 题目描述: Given n non-negative integers representing the histogram's bar height where the ...
- LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)
题目描述 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的 ...
- 【LeetCode】84. Largest Rectangle in Histogram 柱状图中最大的矩形(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址: https://leetc ...
- LeetCode 84. Largest Rectangle in Histogram 单调栈应用
LeetCode 84. Largest Rectangle in Histogram 单调栈应用 leetcode+ 循环数组,求右边第一个大的数字 求一个数组中右边第一个比他大的数(单调栈 Lee ...
- Java for LeetCode 084 Largest Rectangle in Histogram【HARD】
For example, Given height = [2,1,5,6,2,3], return 10. 解题思路: 参考Problem H: Largest Rectangle in a Hist ...
- LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)
84. 柱状图中最大的矩形 84. Largest Rectangle in Histogram
- 刷题84. Largest Rectangle in Histogram
一.题目说明 题目84. Largest Rectangle in Histogram,给定n个非负整数(每个柱子宽度为1)形成柱状图,求该图的最大面积.题目难度是Hard! 二.我的解答 这是一个 ...
- 【LeetCode】84. Largest Rectangle in Histogram
Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...
随机推荐
- Ubentu下安装Docker
具体可以查看Docker官网,我是在服务器上面操作 1,sudo apt-get install -y apt-transport-https ca-certificates curl softwar ...
- ansible(2)
一.ansible模块(yum.pip.service.conr.user.group) 上篇中我们已经学了ansible的几个模块,接下来再来学习几个,那么你是否知道ansible一共有多少模块呢? ...
- JSP学习(第二课)
把GET方式改为POST在地址栏上就不会显示. 发现乱码了,设置编码格式(这个必须和reg.jsp中page的charset一致): 但是注意了!我们传中文名,就会乱码: 通过get方式提交的请求无 ...
- swagger接口变动监控
版本与版本之间迭代,总会发生接口的变化,而这些变化开发不会都告诉测试,测试需要把全部接口检查一遍,这样就降低了测试效率. 为了解决这个问题,结合公司实际项目进行了以下设计: 1.对比测试环境swagg ...
- nginx配置ThinkPHP5二级目录访问
可以通过 http://www.mracale.com/项目名/模块名/方法名 进行访问 第一步 首先,你要确保在不配置二级目录的情况下,可以通过浏览器访问到.例如:http://www.mracal ...
- 教你编译PHP7 (nginx+mysql+php7)
# 安装编译工具: yum install gcc automake autoconf libtool gcc-c++ # 安装基础库 yum install gd zlib zlib-devel o ...
- Spring框架第四篇之基于注解的DI注入
一.说明 与@Component注解功能相同,但意义不同的注解还有三个: 1)@Repository:注解在Dao实现类上 2)@Service:注解在Service实现类上 3)@Controlle ...
- 漫谈DOM 事件流的三个阶段
一丶 流 什么是流? 比如 react 中的单项数据流,Node.js 中的流,或者本文中的 DOM 事件流,都是流的具体体现.专业地讲,流是程序输入或输出的一个连续的字节序列:通俗地讲,流是有方向的 ...
- Delphi APP 開發入門(九)拍照與分享
Delphi APP 開發入門(九)拍照與分享 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數:30 ...
- cdoj1588 潘爷泡妹
地址:http://acm.uestc.edu.cn/#/problem/show/1588 题目:复制过来发现有问题,自己去cdoj看吧 思路: 1.先进行多次spfa跑出所有人之间的相互到达所需要 ...