Leetcode 221.Maximal Square

Maximal Square

  • 1、题目描述
  • 2、解题关键
  • 3、代码

1、题目描述

Leetcode 221.Maximal Square_第1张图片

  • 输入:一个由 ‘0’‘1’ 组成的m*n矩阵
  • 输出:其中最大 ‘1’ 方阵(即全由 ‘1’ 组成,且m=n的矩阵)的长度m

2、解题关键

Leetcode 221.Maximal Square_第2张图片

  • 图中颜色为红、绿、蓝的矩形都是长为n-1的正方形
  • 可认为绿色矩形是红色向下平移1,蓝色矩形是红色向右平移1
  • 黄色矩形一定是长为n的正方形

3、代码

使用dp来运用上述规律
dp[i][j]表示以坐标为(i,j)作为右下点的正方形的长

可得出状态转移方程:

dp[i][j] = min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j]) + 1

取最小,你可以理解为红、绿、蓝矩形中两个大点的矩形将自己的长变为了最小的那个矩形的长,这样又变成了三个长相等的矩形的情形。

最后只要用一个max记录过程中最长的边即可

class Solution {
    public int maximalSquare(char[][] m) {
        if(m==null || m.length==0 || m[0].length==0)
            return 0;
        int x = m.length;
        int y = m[0].length;
        int max = 0;
        int[][] dp = new int[x+1][y+1];
        for(int i=1; i<=x; i++){
            for(int j=1; j<=y; j++){
                if(m[i-1][j-1]=='1'){
                    dp[i][j] = Math.min(dp[i-1][j-1],Math.min(dp[i][j-1],dp[i-1][j]))+1;
                    max = Math.max(max,dp[i][j]);
                }
            }
        }
        return max*max;
    }
}

你可能感兴趣的:(leetcode,leetcode,算法,动态规划)