4.1(动态规划)

4.1

Lc.221.最大正方形

暴力法

有点难懂

class Solution {
    public int maximalSquare(char[][] matrix) {
        int maxSide = 0;
        int rows = matrix.length, cols = matrix[0].length;
        for (int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++){
                if (matrix[i][j] == '1'){
                    maxSide = Math.max(maxSide, 1);
                    int currentMaxSide = Math.min(rows - i, cols - j);
                    for (int k = 1; k < currentMaxSide; k++){
                        boolean flag = true;
                        if (matrix[i + k][j + k] == '0'){
                            break;//判断对角线是否为0
                        }
                        for (int m = 0; m < k; m++){
                            if (matrix[i + k][j + m] == '0' || matrix[i + m][j + k] == '0'){
                                //判断新增的最右列和最下面一行
                                flag = false;
                                break;
                            }
                        }
                        if (flag){
                            maxSide = Math.max(maxSide, k + 1);
                        }
                        else {
                            break;
                        }

                    }
                }
            }
        }
        int maxSquare = maxSide * maxSide;
        return maxSquare;
    }
}

动态规划

感觉很难想到

  • point1
class Solution {
    public int maximalSquare(char[][] matrix) {
        int maxSide = 0;
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0){
            return 0;
        }
        int rows = matrix.length, cols = matrix[0].length;
        int[][] dp = new int[rows][cols];
        for (int i = 0; i < rows; i++){
            for (int j = 0; j < cols; j++){
                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 - 1][j - 1]),dp[i][j - 1]) + 1;
                    }
                   maxSide = Math.max(maxSide, dp[i][j]);//通过比较排去之前的,筛选出最大值(动态规划)
                }
            }
        }
        int maxSquare = maxSide * maxSide;
        return maxSquare;
    }
}
posted @ 2026-04-01 21:33  shitnotme  阅读(6)  评论(0)    收藏  举报