zl程序教程

您现在的位置是:首页 >  其他

当前栏目

221. 最大正方形

2023-04-18 16:12:50 时间

一 . 题目

二. 思路:

我们用 dp(i,j) 表示以 (i, j)(i,j) 为右下角,且只包含 1 的正方形的边长最大值。 如果我们能计算出所有dp(i,j) 的值,那么其中的最大值即为矩阵中只包含 11 的正方形的边长最大值,其平方即为最大正方形的面积。

那么如何计算 extit{dp}dp 中的每个元素值呢?对于每个位置 (i, j)(i,j),检查在矩阵中该位置的值:

  • 初始值问题:如果matrix[i][j]=0,则dp[i][j]=0
  • 边界问题:如果matrix[i][j]=1情况下i=0||j=0,则
  • 递归问题 dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]) (递归公式证明)

三 代码:

class Solution {
        //初始值问题:如果matrix[i][j]=0,则dp[i][j]=0
        //边界问题:如果matrix[i][j]=1情况下i=0||j=0,则
        //递归问题 dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])
        public int maximalSquare(char[][] matrix) {
            //max存储最大边长
            int max=0;
            if (matrix==null||matrix.length==0||matrix[0].length==0){
                return max;
            }


            //初始化dp
            int[][] dp=new int[matrix.length][matrix[0].length];
            int rows=matrix.length;
            int columns=matrix[0].length;
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < columns; j++) {
                    //这里不用写等于0的代码,参见1,而基础类型默认值就是0,因此代码不用写
                    if (matrix[i][j]=='1'){
                        if (i==0||j==0){
                            dp[i][j]=1;
                        }else {
                            dp[i][j]=Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
                        }
                        max=Math.max(dp[i][j],max);
                    }
                }
            }

            return max*max;
        }
    }