leetcode#85 最大矩阵


leetcode#85 最大矩阵

题目链接

分析

  • 预处理好$f$ 函数,其含义如下:

    f[i][j][k]=
        从 Matrix[i][j] 往上数有多少个连续的1, k=0  
        从 Matrix[i][j] 往左数有多少个连续的1, k=1
  • 接下来遍历整个矩阵的各个位置时,考虑以这个矩阵为右下角,能往左和往上扩展的最大矩阵的面积是多少,维护一个单调栈即可。

代码

class Solution {
public:
    int dp[205][205][2];    // 0,row; 1,col.
    int maximalRectangle(vector<vector<char>>& matrix) {
        int rows = matrix.size();
        int cols = matrix[0].size();

        int ans=0;
        if(matrix[0][0]=='1'){
            dp[0][0][0]=dp[0][0][1]=1;
            ans=1;
        }
        else{
            dp[0][0][0]=dp[0][0][1]=0;
        }
    
        for(int i=1;i<rows;i++){
            if(matrix[i][0]=='1'){
                dp[i][0][0]=dp[i-1][0][0]+1;
                dp[i][0][1]=1;
            }
            else{
                dp[i][0][0]=dp[i][0][1]=0;
            }
            ans=max(dp[i][0][0],ans);
        }
        for(int i=1;i<cols;i++){
            if(matrix[0][i]=='1'){
                dp[0][i][0]=1;
                dp[0][i][1]=dp[0][i-1][1]+1;
            }
            else{
                dp[0][i][0]=dp[0][i][1]=0;
            }
            ans=max(dp[0][i][1],ans);
        }

        for(int i=1;i<rows;i++){
            for(int j=1;j<cols;j++){
                if(matrix[i][j]=='1'){
                    dp[i][j][0]=dp[i-1][j][0]+1;
                    dp[i][j][1]=dp[i][j-1][1]+1;
                }
                else{
                    dp[i][j][0]=dp[i][j][1]=0;
                }
            }
        }
    
        for(int i=1;i<rows;i++){
            for(int j=1;j<cols;j++){
                if(matrix[i][j]=='1'){
                    int tmp1=dp[i][j][0];
                    int tmp2=1;
                    ans=max(ans,tmp1*tmp2);
                    while(j-tmp2>=0 && tmp1){
                        tmp1=min(tmp1,dp[i][j-tmp2][0]);
                        tmp2++;
                        ans=max(ans,tmp1*tmp2);
                    }

                    tmp1=dp[i][j][1];
                    tmp2=1;
                    while(i-tmp2>=0 && tmp1){
                        tmp1=min(tmp1,dp[i-tmp2][j][1]);
                        tmp2++;
                        ans=max(ans,tmp1*tmp2);
                    }
                }
            }
        }

        return ans;
    }
};

文章作者: 李立基
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 李立基 !
  目录