https://leetcode-cn.com/problems/maximal-rectangle/

分析

本题可看做“最大广告牌”题的变式,只需枚举以每一行为“地面”,每一列上连续“1”个数为“建筑物高度”,所有枚举中的“最大广告牌”面积即可。采用单调队列算法,记录每个点可向左右延伸的距离为长度,即记录每个点左右第一个比它的“当前高度”小的“建筑物坐标”,以该点“建筑物高度”为宽度,即可求出此时的“广告牌面积”。枚举每一列得到的最大“广告牌面积”即为本题所求解。

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int rows=matrix.size();
        if(rows==0)return 0;
        int lr=matrix[0].size(),ans=0,juzhen[210][210]={0};
        
        for(int i=0;i<rows;i++)
        {
            if(i==0)
            {
                for(int j=0;j<lr;j++)
                {
                    juzhen[i][j]=matrix[i][j]-'0';
                }
            }
            else
            {
                for(int j=0;j<lr;j++)
                {
                    if(matrix[i][j]=='1')juzhen[i][j]=juzhen[i-1][j]+matrix[i][j]-'0';
                }
            }
        }
        for(int i=0;i<rows;i++)
        {
            for(int j=0;j<lr;j++)cout<<juzhen[i][j]<<" ";
            cout<<endl;
        }
        cout<<endl;
        if(lr==1)
        {
            for(int j=0;j<rows;j++)
            {
                ans=max(ans,juzhen[j][0]);
            }
            return ans;
        }
        for(int row=0;row<rows;row++)
        {
            int pre[210]={0},next[210]={0},r=0,q[210]={0},i=2;
            pre[0]=-1;
            q[0]=0;
            if(juzhen[row][1]<=juzhen[row][q[r]])
            {
                q[0]=1;
                pre[1]=-1;
            }
            else{
                q[++r]=1;
                pre[1]=0;
            }
            while(i<lr)
            {
                while(r>=0&&juzhen[row][i]<=juzhen[row][q[r]])r--;
                if(r==-1)pre[i]=-1;
                else pre[i]=q[r];
                q[++r]=i;
                i++;
            }
            int daozhi[210]={0};
            for(int j=0;j<lr;j++)daozhi[j]=juzhen[row][lr-j-1];
            i=2,r=0,q[0]=0,next[lr-1]=lr;
            if(daozhi[1]<=daozhi[q[r]])
            {
                q[0]=1;
                next[lr-1-1]=lr;
            }
            else
            {
                q[++r]=1;
                next[lr-1-1]=lr-1;
            }
            while(i<lr)
            {
                while(r>=0&&daozhi[i]<=daozhi[q[r]])r--;
                if(r==-1)next[lr-1-i]=lr;
                else next[lr-1-i]=lr-1-q[r];
                q[++r]=i;
                i++;
            }
            for(int k=0;k<lr;k++)cout<<pre[k]<<" ";
            cout<<endl;
            for(int k=0;k<lr;k++)cout<<next[k]<<" ";
            cout<<endl;
            cout<<endl;
            for(int j=0;j<lr;j++)
            {
                int rec=(next[j]-pre[j]-1)*juzhen[row][j];
                if(rec>ans)ans=rec;
            }
        }
        return ans;
    }
};