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.
Example:
Input: [2,1,5,6,2,3] Output: 10
思路:通过栈 存储 依序增长 未被计算 的柱,依次遍历,当存在比当前柱值大的栈值时,开始计算该柱的最大面积。
注意:栈为空,说明该柱是最低点,边界为最左最右,否则边界 = (当前序号 - 下一个栈值 - 1),选取下一个栈值是因为左侧可能存在更低柱,也可计算面积,-1是因为下一个柱不在计算范围内。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
//单向栈解法
stack<int> stk;
heights.push_back(-1);
int area =0;
for(int i=0; i < heights.size(); i++){
//当收集的栈存在大于当前高度时,开始计算最大面积
while(!stk.empty() && (heights[stk.top()] > heights[i])){
int h = heights[stk.top()];
stk.pop();
//栈为空,说明该值是最低点,不为空,选取下一个栈值作为左边界(下一个栈值更小)
area = max(area, h*(stk.empty()? i:(i-stk.top()-1)));
}
stk.push(i);
}
return area;
}
};