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
.
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
stack<int> s;
height.push_back(0);
int result = 0;
for (int i = 0; i < height.size(); ) {
if (s.empty() || height[i] > height[s.top()])
s.push(i++);
else {
int tmp = s.top();
s.pop();
result = max(result,
height[tmp] * (s.empty() ? i : i - s.top() - 1));
}
}
return result;
}
};
1、height.push_back(0):加入一个高度0不会影响到最大面积的结果,同时把最后的高度考虑进while循环中。
2、if(s.empty() || height[i] > height[s.top()]):当栈为空或递增时,入栈。else:当前位置高度 小于 栈顶位置的高度,出栈,求面积(此位置以前的最大面积)。
3、height[tmp] * (s.empty() ? i : i - s.top() - 1)):高度:栈顶位置的高度,因为从栈顶到当前位置必定栈顶高度为最低高度(若有更低高度已经提前出栈),宽度:若栈为空,则到向量的头部即宽度为i,若不为空,则到栈顶的位置即i-1 - s.top()。