84. 柱狀圖中最大的矩形(單調棧)

在這裏插入圖片描述
暴力

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n=heights.size();
        int i,j,k;
        int ans=0;
        for(i=0;i<n;i++){
            for( j=i-1;j>=0;j--){
                if(heights[j]<heights[i]) break;
                
            }
            for( k=i+1;k<n;k++){
                if(heights[k]<heights[i]) break;
            }
            ans=max(heights[i]*(k-j-1),ans);
        }
        return ans;
    }
};

單調棧

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        vector<int> left(n), right(n);
        stack<int> mono_stack;
        for(int i=0;i<n;i++){
            while(!mono_stack.empty()&&heights[i]<=heights[mono_stack.top()]){
                mono_stack.pop();
            }
            left[i]=mono_stack.empty()?-1:mono_stack.top();
            mono_stack.push(i);
        }
        mono_stack=stack<int>();
        for(int i=n-1;i>=0;i--){
            while(!mono_stack.empty()&&heights[i]<=heights[mono_stack.top()]){
                mono_stack.pop();
            }
            right[i]=mono_stack.empty()?n:mono_stack.top();
            mono_stack.push(i);
        }
        int ans=0;
        for(int i=0;i<n;i++){
            ans=max(ans,heights[i]*(right[i]-left[i]-1));
        }
        return ans;
    }
};
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        vector<int> left(n), right(n);
        stack<int> mono_stack;
        for(int i=0;i<n;i++){
            while(!mono_stack.empty()&&heights[i]<=heights[mono_stack.top()]){
                right[mono_stack.top()]=i;
                mono_stack.pop();
                
            }
            left[i]=mono_stack.empty()?-1:mono_stack.top();
            mono_stack.push(i);
        }
        while(!mono_stack.empty()){
            right[mono_stack.top()]=n;
            mono_stack.pop();
        }
        int ans=0;
        for(int i=0;i<n;i++){
            ans=max(ans,heights[i]*(right[i]-left[i]-1));
        }
        return ans;
    }
};

python

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        stack=list()
        n=len(heights)
        left=[0]*n
        right=[n]*n
        ans=0   
        for i in range(n):
            while stack and heights[i]<=heights[stack[-1]]:
                right[stack[-1]]=i
                stack.pop()
            left[i]= stack[-1] if  stack else -1
            stack.append(i)
        # while stack:
        #     right[stack[-1]]=n
        #     stack.pop()
        
        for i in range(n):
            ans=max(ans,(right[i]-left[i]-1)*heights[i])
        return ans
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章