LeetCode第221题:最大正方形(中等)

LeetCode第221题:最大正方形(中等)

  • 题目:在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
    在这里插入图片描述
  • 解题思路:想着从最大的正方形开始判断,再将边长依次缩小,但是没过
class Solution {
    public int maximalSquare(char[][] matrix) {
        int ans = matrix.length;
        int len = matrix.length;
        int res = 0;
        if(len == 0) return 0;
        int yy = 0;
        int i=0,j=0;
        while(ans>1){
            while(i<len){
                while(j<len){
                    if(matrix[i][j]=='1'){
                        if(i+ans>len){
                            i = 0;
                            j = 0;
                            ans--;
                        }else if(j+ans>len){
                            i++;
                            j = 0;
                        }else{
                            int k = 1;
                            int m = 0;
                            while(i+m<len && m<=ans){
                                while(j+k<len && k<=ans){
                                    if(matrix[i+m][j+k]=='1'){
                                        res = 1;
                                        if(m==ans && k==ans) return (1+ans)*(1+ans);
                                        k++;
                                    }else{
                                        yy = 1;
                                        ans--;
                                        break;
                                    }
                                    
                                }
                                if(yy==1) break;
                                m++;
                            }
                        }
                    }
                    j++;
                }
                i++;
            }
        }
        return res==1?(1+ans)*(1+ans):0;
    }
}
  • 题解做法:min(上, 左, 左上) + 1,利用木桶的短板理论进行动态规划
class Solution {
    public int maximalSquare(char[][] matrix) {
        // base condition
        if (matrix == null || matrix.length < 1 || matrix[0].length < 1) return 0;

        int height = matrix.length;
        int width = matrix[0].length;
        int maxSide = 0;

        // 相当于已经预处理新增第一行、第一列均为0
    //  int[][] dp = new int[height + 1][width + 1];
        int[] dp = new int[width + 1];
        int northwest = 0; // 西北角、左上角

    //  for (int row = 0; row < height; row++) {
        for (char[] chars : matrix) {
            northwest = 0; // 遍历每行时,还原回辅助的原值0
            for (int col = 0; col < width; col++) {
                int nextNorthwest = dp[col + 1];
                if (chars[col] == '1') {
    //              dp[row + 1][col + 1] = Math.min(Math.min(dp[row + 1][col], dp[row][col + 1]), dp[row][col]) + 1;
                    dp[col + 1] = Math.min(Math.min(dp[col], dp[col + 1]), northwest) + 1;

    //              maxSide = Math.max(maxSide, dp[row + 1][col + 1]);
                    maxSide = Math.max(maxSide, dp[col + 1]);
                } else {
                    dp[col + 1] = 0;
                }
                northwest = nextNorthwest;
            }
        }
        return maxSide * maxSide;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值