观察后可以发现,对于每个块成产生的以他为高的最大面积的宽度,就是左边第一个比他小的位置到它右边第一个比他小的位置。
那么,我们可以用一个单调递增栈,在退栈时维护即可,显然退栈时栈顶和当前元素就是他左边第一个比他小的和右边第一个比他小的。
然后为了不在特殊处理结束后没退栈的元素,我们在头尾插入两个0元素,这样就能保证所有元素都必定能找到左边和右边比他小的元素。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution { public: int largestRectangleArea(vector<int>& heights) { heights.push_back(0); heights.insert(heights.begin(),0); int N = 1e5+5,len = heights.size(); long long ans = 0; int S[N],top = 0;//单调递增栈 for(int i = 0;i < len;++i) { while(top != 0 && heights[i] < heights[S[top]]) { int dis = i-S[top-1]-1; long long ma = (long long)dis*heights[S[top]]; if(ma > ans) ans = ma; top--; } S[++top] = i; } return ans; } };