【202304113】【每日一题】柱状图中最大的矩形

【202304113】【每日一题】柱状图中最大的矩形_第1张图片


单调栈,维护一个单独递增的栈,只有放入元素比栈顶元素大才入栈,否则一直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& heights) {
        //单调栈
        stack st;
        st.push(-1);//栈的初始化  数组的下标入栈
        heights.emplace_back(0);//在数组最后加上0,这样才能计算所有情况
        int res=0;//记录最大面积
        for(int i=0;i=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;
    }
};

你可能感兴趣的:(Leetcode刷题,开发语言,c++,算法,leetcode)