leetcode Largest Rectangle in Histogram 代码解析
来源:互联网 发布:戏子当道知乎 编辑:程序博客网 时间:2024/05/22 07:58
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.
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.
For example,
Given height = [2,1,5,6,2,3]
,
return 10
.
O(n)的解法的步骤:
(1) 在height尾部添加一个0,也就是一个高度为0的立柱。作用是在最后也能凑成上面提的那种“波峰图”。
(2) 定义了一个stack,然后遍历时如果height[i] 大于stack.top(),进栈。反之,出栈直到栈顶元素小于height[i]。
由于出栈的这些元素高度都是递增的,我们可以求出这些立柱中所围成的最大矩形。更妙的是,由于这些被弹出的立柱处于“波峰”之上(比如弹出i 到 i+k,那么所有这些立柱的高度都高于 i-1和 i+k+1的高度),因此,如果我们使用之前所提的“左右延伸找立柱”的思路解,以这些立柱的高度作为整个矩形的高度时,左右延伸出的矩形所包含的立柱不会超出这段“波峰”,因为波峰外的立柱高度都比他们低。“波峰图”其实就是求解最大矩形的“孤岛”,它不会干扰到外部。
(3) 由于比height[i]大的元素都出完了,height[i]又比栈顶元素大了,因此再次进栈。如此往复,直到遍历到最后那个高度为0的柱,触发最后的弹出以及最后一次面积的计算,此后stack为空。
(4) 返回面积最大值。
栈中存的不是高度,而是height的索引,这样做的好处是不会影响宽度的计算,索引值相减 = 宽度。
自己实现代码如下,虽然是二重循环,但时间复杂度实际 2N,故为O(N)
class Solution {
public:
int largestRectangleArea(vector<int>& height) {
height.push_back(0);
vector<int> sta(height.size());
int n=-1,sum=0;
for(int i=0;i<height.size();i++){
if(n<0||height[i]>=height[sta[n]])
sta[++n]=i;
else{
sum=max(sum,height[sta[n]]*(n<=0?i:(i-sta[n-1]-1)));
i--;n--;
}
}
return sum;
}
};
此解法最大亮点就在于
(1) stack里存的是index,计算面积时的宽度使用 index的差值,所以虽然stack 弹出了立柱,但是不影响宽度的计算,依然可以计算面积。
(2) 这种解法本质上是查看以每一个立柱为矩形高度,求出最大面积,但是它通过入栈出栈,把整个height变成一组组“波峰图”来解,这种高度布局下,最大面积的计算是O(n)的,然后将所有波峰图的最大面积取最大值。最后做到了以O(n)的时间复杂度覆盖了所有的立柱。
多么精彩的解法!
- leetcode Largest Rectangle in Histogram 代码解析
- LeetCode: Largest Rectangle in Histogram
- LeetCode Largest Rectangle in Histogram
- LeetCode: Largest Rectangle in Histogram
- [Leetcode] Largest Rectangle in Histogram
- [LeetCode] Largest Rectangle in Histogram
- [Leetcode] Largest Rectangle in Histogram
- [leetcode] Largest Rectangle in Histogram
- [LeetCode]Largest Rectangle in Histogram
- Leetcode: Largest Rectangle in Histogram
- [leetcode]Largest Rectangle in Histogram
- Leetcode:Largest Rectangle in Histogram
- LeetCode-Largest Rectangle in Histogram
- LeetCode Largest Rectangle in Histogram
- [LeetCode] Largest Rectangle in Histogram
- leetcode Largest Rectangle in Histogram
- [LeetCode] Largest Rectangle in Histogram
- leetcode Largest Rectangle in Histogram
- 第二讲:创建网站(学习笔记)
- Js日历插件Wdate进行时间限制
- xUtils 源码解析
- tomcat安装--mac
- [CSS3] 盒模型 & overflow & resize & outline
- leetcode Largest Rectangle in Histogram 代码解析
- memcached---安装、启动和关闭
- 经典CSS实现三角形图标原理解析
- Oracle根据身份证号码判断性别
- iOS开发中MD5的精髓
- Android:进程间通信交互
- 第十五周【项目1 - 验证算法】
- 判断手机号码的正则表达式
- 开发随笔