LeetCode221. Maximal Square

1、题目链接

https://leetcode.com/problems/maximal-square/

2、解题思路

这道题目的意思是给你一个二维数组,数组中的值只会有0和1,让你找出只包含1的最大的一个正方形的面积(换句话说也就是求正方形的最大边长),最开始我想的也是暴力求解,就是遍历整个数组,然后记录起点为1的点的那一行以及那一列的1的最大数,但是感觉这种方式不太友好,后面也是看了题解才知道这是一道动态规划题目(DP),DP的最大难点就是找状态转移方程,这一块是我比较弱的地方,今天也是参考了题解,然后才找出来状态转移方程,我们用dp[i][j]表示右下角坐标为i和j的正方形的边长,除去边界情况,任意一个dp[i][j]都是由其左边,上边,和左上边来决定的,所以我们的转移方程为:

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

1就是当前dp[i][j]为1的时候需要加1,然后剩下的就看另外三条边是否全是1了。

3、代码

public int maximalSquare(char[][] matrix) {
    int lengthX = matrix.length;
    if (lengthX == 0) return 0;
    int max = 0;
    int lengthY = matrix[0].length;
    int[][] dp = new int[lengthX + 1][lengthY + 1];
    for (int i = 1; i <= lengthX; ++i) {
        for (int j = 1; j <= lengthY; ++j) {
            if (matrix[i - 1][j - 1] == '1') {
                dp[i][j] = 1 + Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1]));
                max = Math.max(max, dp[i][j]);
            }
        }
    }
    return max * max;
}

4、结果

LeetCode221. Maximal Square_第1张图片
CAB1E81B-55B9-4732-A17D-C0979BF68C41.png

你可能感兴趣的:(LeetCode221. Maximal Square)