用栈维护一个非递减的序列,例如 1 2 2 3
从左往右扫描数组,当前扫描到第i个,如果第i个的height小于栈顶元素的height,表示以栈顶元素的height为高的矩形不可能再向右扩充(因为右边的height已经小于栈顶元素的height),所以栈里面的元素中所有height>height[i]的元素往右能扩充到i-1的位置,往左能扩充到上一个比它小的元素的位置+1。
例如上图,当i==6时,栈内已有元素为1,2,3,4,5(元素的index),heights[6] < height[栈顶元素],5出栈,其他仍小于等于height[6]。当i==7时,开始计算栈内元素能构成的最大面积,例如i==3的元素能构成的最大面积为heights[3] * (7 - 2 - 1) = 8,i==2的元素能构成的最大面积为heights[2] * (7 - 1 - 1) = 10。
在heights数组首尾分别补一个0来控制边界条件。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int ans = 0;
int n = heights.size();
if(!n) return ans;
heights.insert(heights.begin(), 0);
heights.push_back(0);
stack<int> s;
for(int i = 0; i <= heights.size(); i++){
while(!s.empty() && heights[s.top()] > heights[i]){
int tmp = s.top();
s.pop();
int area = (i - s.top() - 1) * heights[tmp];
ans = max(ans, area);
}
s.push(i);
}
return ans;
}
};