详细思路

 

对于遍历每一层并求出以该层为底的1的高度数组,看作是求 84:柱状图中最大的矩形,更新答案,继续遍历下一层

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int ans=-0x3f3f3f3f;
        int n=matrix.size();
        if(n==0)return 0;
        int m=matrix[0].size();
        vector<int>heights(m,0);
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(matrix[i][j]=='1')heights[j]+=1;
                else heights[j]=0;
            }
            ans=max(ans,largestRectangleArea(heights));
        }
        return ans;
    }
    int largestRectangleArea(vector<int>&heights){
        int n=heights.size();
        vector<int>left(n,-1);
        vector<int>right(n,n);
        stack<int>stk;
        stk.push(-1);
        for(int i=0;i<n;i++){
            while(1){
                if(stk.top()==-1){
                    left[i]=-1;
                    stk.push(i);
                    break;
                }
                else if(heights[stk.top()]>=heights[i]){
                    stk.pop();
                }
                else if(heights[stk.top()]<heights[i]){
                    left[i]=stk.top();
                    stk.push(i);
                    break;
                }
            }
        }
        stack<int>stk1;
        stk1.push(n);
        for(int i=n-1;i>=0;i--){
            while(1){
                if(stk1.top()==n){
                    right[i]=n;
                    stk1.push(i);
                    break;
                }
                else if(heights[stk1.top()]>=heights[i]){
                    stk1.pop();
                }
                else if(heights[stk1.top()]<heights[i]){
                    right[i]=stk1.top();
                    stk1.push(i);
                    break;
                }
            }
        }
        int ans=0;
        for(int i=0;i<n;i++){
            int low=(right[i]-1)-(left[i]+1)+1;
            ans=max(ans,low*heights[i]);
        }
        return ans;
    }
};

 

 

踩过的坑
一定要和上一题求柱形图最大矩形联系起来
posted on 2021-07-31 11:47  offer快到碗里来~  阅读(42)  评论(0)    收藏  举报