单调栈,维护一个单独递增的栈,只有放入元素比栈顶元素大才入栈,否则一直pop +计算最大面积。
栈中初始化一个-1,数组的末尾添加一个元素0,这样才能计算所有的情况(或者说清空栈)。
以2 1 5 6 2 3为例
栈中下标元素 | 当前矩形最大面积 | 操作情况 |
[-1,0] | 0 | 0入栈 |
[-1] | 2 | 1<2,0出栈,2*(1-(-1)-1)=2 |
[-1,1] | 2 | 1入栈 |
[-1,1,2] | 2 | 5>1,2入栈 |
[-1,1,2,3] | 2 | 6>5,3入栈 |
[-1,1,2] | 6 | 2<6,3出栈,6*(4-2-1)=6 |
[-1,1] | 10 | 2<5,2出栈,5*(4-1-1)=10 |
[-1,1,4] | 10 | 2>1,4入栈 |
[-1,1,4,5] | 10 | 3>2,5入栈 |
[-1,1,4] | 10 | 0<3,5出栈,3*(6-4-1)=3 |
[-1,1] | 10 | 0<2,4出栈,2*(6-1-1)=8 |
[-1] | 10 | 0<1,1出栈,1*(6-(-1)-1)=6 |
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
//单调栈
stack<int> st;
st.push(-1);//栈的初始化 数组的下标入栈
heights.emplace_back(0);//在数组最后加上0,这样才能计算所有情况
int res=0;//记录最大面积
for(int i=0;i<heights.size();i++){
while(st.top()!=-1&&heights[st.top()]>=heights[i]){
int height=heights[st.top()];//高
st.pop();
int width=i-st.top()-1;
res=max(res,height*width);
}
st.push(i);
}
return res;
}
};