4.1.3LeetCode: Largest Rectangle in Histogram(直方图最大面积)
来源:互联网 发布:怎样在淘宝开店铺 编辑:程序博客网 时间:2024/05/21 06:11
http://www.cnblogs.com/avril/archive/2013/08/24/3278873.html
具体的题目描述为:
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
.
这个方法非常巧妙,最好通过一个图来理解:
假设输入直方图为:int[] height = {2,7,5,6,4}.
这个方法运行的时候,当遇到height[2] == 5的时候,发现其比之前一个高度小,则从当前值(5)开始,向左搜索比当前值小的值。当搜索到最左边(2)时,比5小,此时计算在height[0]和height[2]之间的最大面积,注意不包括height[0]和和height[2]。height[1]以红色标出的这个区域就被计算完成。同样的方法,计算出绿色和粉色的面积。
因此这个方法需要使用两个栈。第一个栈为高度栈heightStack,用于记录还没有被计算过的连续递增的序列的值。第二个栈为下标栈indexStack,用于记录高度栈中对应的每一个高度的下标,以计算宽度。
算法具体执行的步骤为:
若heightStack为空或者当前高度大于heightStack栈顶,则当前高度和当前下标分别入站(下面有一个解法可以只用一个栈即可,用栈来保存下标,而高度由下标很容易得到)。所以heightStack记录了一个连续递增的序列。
若当前高度小于heightStack栈顶,heightStack和indexStack出栈,直到当前高度大于等于heightStack栈顶。出栈时,同时计算区间所形成的最大面积。注意计算完之后,当前值入栈的时候,其对应的下标应该为最后一个从indexStack出栈的下标。比如height[2]入栈时,其对应下标入栈应该为1,而不是其本身的下标2。如果将其本身下标2入栈,则计算绿色区域的最大面积时,会忽略掉红色区域。
C++代码:
class Solution {public: int largestRectangleArea(vector<int> &height) { if(height.size() == 0) return 0; int res = 0; vector<int> tmp = height; tmp.push_back(0); // Important stack<int> s; for(int i = 0; i < tmp.size(); i++) { if(s.empty() || (!s.empty() && tmp[i] >= tmp[s.top()])) s.push(i); else{ while(!s.empty() && tmp[s.top()] > tmp[i]) { int idx = s.top(); s.pop(); int width = s.empty() ? i : (i-s.top()-1); res = max(res, tmp[idx] * width); } s.push(i); // Important } } return res; }};
- 4.1.3LeetCode: Largest Rectangle in Histogram(直方图最大面积)
- LeetCode: Largest Rectangle in Histogram(直方图最大面积)
- Largest Rectangle in Histogram (直方图中最大面积) 【leetcode】
- Largest Rectangle in Histogram 直方图中最大的矩形面积
- 【直方图的最大面积】Largest Rectangle in Histogram
- ACM-直方图最大面积-Largest Rectangle in Histogram
- LeetCode_直方图最大面积(Largest Rectangle in Histogram)
- [LeetCode]—Largest Rectangle in Histogram 求直方图最大填充矩形面积
- LeetCode | Largest Rectangle in Histogram(直方图围城的最大矩形面积)
- LeetCode 84. Largest Rectangle in Histogram(直方图最大矩形)
- [Leetcode] largest rectangle in histogram 直方图中最大的矩形
- leetcode 84. Largest Rectangle in Histogram 最大直方图
- LeetCode 4.1.3 Largest Rectangle in Histogram
- LeetCode OJ 之 Largest Rectangle in Histogram (直方图中的最大矩形)
- leetCode 84.Largest Rectangle in Histogram (最大矩形直方图) 解题思路和方法
- 直方图最大矩形问题(Largest Rectangle in Histogram)
- 直方图最大矩形问题(Largest Rectangle in Histogram)
- 寻找直方图中的最大矩形 Largest Rectangle in Histogram
- Linux 系统下文件信息的查询
- HDU-2007
- 验证码(随机数字+字符,数字加减)
- C#泛型-使用委托的Sort排序方法
- 解题报告 之 POJ1226 Substrings
- 4.1.3LeetCode: Largest Rectangle in Histogram(直方图最大面积)
- fragment问题,不知道怎么解决
- Node.js回调概念
- ASP.NET 上传控件 “Maximum request length exceeded” 异常
- 用Eclipse调试Node.js代码
- JNI 的应用
- maven使用
- String类
- Windows 64位操作系统的ODBC