- Question
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 heights = [2,1,5,6,2,3],
return 10.
思路
- 左右扩展构建矩形。 该思路是基于 最大矩形的高必然是数组中的某个元素, 那么我把每个元素向左右扩展,就可以获得这个元素所能构成的最大面积。 对每个元素重复这一过程就可以找出最大面积。时间复杂度 O(n2) , 在本题中该方法会超时.
- 借助辅助栈查找最大矩形。 将元素的下标i入栈, 直到遇到比它小的元素(下标为j)出栈。那么这个栈永远是保持升序。并且可以计算出栈顶元素所能构成的最大面积。heights[i]*(j-k-1) (k为i出栈后的栈顶元素, 若i出栈后栈为空,则k=-1).
代码如下:
/* 辅助栈方法 */
class Solution {
public:
int largestRectangleArea(vector<int> heights) {
int ret=0;
//把0添加到最后一个元素,保证所有元素都入栈
heights.push_back(0);
stack<int> s;
int len=heights.size();
for(int i=0; i<len; ++i){
while(!s.empty() && heights[s.top()]>heights[i]){
int h=heights[s.top()];
s.pop();
int side=s.empty()?-1:s.top();
if(h*(i-side-1)>ret) ret=h*(i-side-1);
}
s.push(i);
}
return ret;
}
};
/*左右扩展构建最大矩形*/
int largestRectangleArea(vector<int> heights) {
int s = 0;
int len = heights.size();
if (len <= 0) return 0;
int pre;
for (int i = 0; i<len;) {
int h = heights[i];
int j = i + 1;
while (j<len && heights[j] >= heights[i]) {
h += heights[i]; ++j;
}
j = i - 1;
while (j >= 0 && heights[j] >= h) {
h += heights[i]; --j;
}
if (h>s) s = h;
pre = heights[i];
++i;
while (i<len && pre == heights[i]) ++i;
}
return s;
}