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.
思路:用一个栈来保存下标(索引),遇到比栈中下标对应的值大的高度时,就将这个这个高度的下标压入栈中,即保证栈中下标对应的高度是非降型的;遇到比栈中下标对应值小的高度,就计算此时的面积,和res比较,取较大值。为了保证到最后时依旧存在一个不升状态,即结束状态,要在height中压入一个0。下面给出详细的说明。
以题中例子:height =[2,1,5,6,2,3],
1) 刚开始栈中为空,压入下标0;然后当i=1时,2<=1不成立,下标出栈,栈变为空,计算此时面积res=2;
2)高度1,5,6是依次递增的,所以对应下标依次压入栈中;当i=4时,6>2,下标3出栈,所以计算此时的面积res=6,如图:
3)栈顶元素为2,其对应的高度为5>2(此时,还要和下标i=4的高度比较),所以,栈顶元素2出栈,计算面积为res=10;
4)因为栈顶元素为1,其对应的高度为1<2,满足条件,所以,将i入栈,直到i=6(为压入的0);此时栈中的元素为{1,4,5},有一个栈顶元素对应的高度大于i=6对应的高度,所以,5出栈,计算面积为3,其中最大面积为10;
5)栈顶元素为4,其对应高度为2>0,所以,2出栈,计算面积为4,最大面积为10;
6) 此时,栈顶元素为1,对应高度为1>0,所以,1出栈,因为1出栈以后,栈变为空,所以,计算面积的方式有变化,res=height[1]*6=6,最大面积为10。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int w,h,area=0;
stack<int>index;
heights.push_back(0);
for(int i=0;i<heights.size();i++){
while(index.size()&&heights[index.top()]>heights[i]){
h=heights[index.top()];
index.pop();
if(index.size())
w=i-1-index.top();
else
w=i;
area=max(area,w*h);
}
index.push(i);
}
return area;
}
};