题目:
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.
样例:
给出 height = [2,1,5,6,2,3],返回 10
思路:
用一个栈来保存下标,遇到比栈中下标对应的值大的高度时,就将这个这个高度的下标压入栈中,即保证栈中下标对应的高度是非降型的;
遇到比栈中下标对应值小的高度,栈顶元素将会被弹出,计算此时的面积,和res比较,取较大值。这里矩形的高就是弹出的矩形高度,若栈非空,矩形的宽为弹出的元素个数,若栈为空,矩形的宽为目前最大长度i;
为了保证到最后时依旧存在一个不升状态,即结束状态,要在height中压入一个0。
参考答案:
class Solution {
public:
/*
* @param height: A list of integer
* @return: The area of largest rectangle in the histogram
*/
int largestRectangleArea(vector<int> &height) {
// write your code here
int res = 0;
stack<int> s;
height.push_back(0);//保证最小,为的是维护栈到最后
for(int i=0; i<height.size(); i++){//height[i]是这样的状态:它并未入栈只是做比较
if(s.empty() || height[s.top()]<=height[i]){
s.push(i);
}
else{
int temp = s.top();
s.pop();
res = max(res, height[temp]*(s.empty()?(i-1+1):(i-(s.top()+1))));//这句话要好好理解
//由于栈中维护的是一个升序序列,所以最后弹出的那个一定是最小的
i--;//这里保证之前比heght[i]大的都要弹出去
}
}
return res;
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。