力扣 84. 柱狀圖中最大的矩形 單調棧

https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
在這裏插入圖片描述

思路:維護一個單調非降的棧,棧中存放的是該柱子在heightsheights數組中的下標,那麼當heights[i]<heights[s.top()]heights[i]<heights[s.top()],我們逐一彈出元素,並更新答案ans=max(ans,(is.top())heights[s.top()])ans=max(ans,(i-s.top())*heights[s.top()]),這裏應該很好理解,因爲維護的是一個非降的棧,所以is.top()i-s.top()個柱子的高度都大於棧頂柱子的高度。當上述條件不滿足時,我們壓入最後一次彈出的棧頂的值,設爲tmptmp,並修改heights[tmp]=heights[i]heights[tmp]=heights[i],這裏可能不太好理解,再次壓入tmptmp其實是表示在ii左側的高度大於heights[i]heights[i]的柱子個數。我們結合下圖看一下:
在這裏插入圖片描述當處理到第44個柱子((下標爲3)3)時,在它之前的兩個柱子都要彈出,爲了後續能正確計算結果,需要再次壓入11,並修改heights[1]=heights[3]heights[1]=heights[3 ]

爲了使所有元素都能出棧,我們在heightsheights後壓入一個1-1

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> s;
        heights.push_back(-1);
        int ans=0;
        for(int i=0;i<heights.size();i++){
            if(s.empty()||heights[i]>=heights[s.top()])
                s.push(i);
            else{
                int tmp;
                while(!s.empty()&&heights[i]<heights[s.top()]){
                    tmp=s.top();
                    ans=max(ans,(i-tmp)*heights[tmp]);
                    s.pop();
                }
                s.push(tmp);
                heights[tmp]=heights[i];
            }
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章