Leetcode 221. Maximal Square

这篇博客探讨了两种使用动态规划(DP)方法解决寻找矩阵中最大正方形边长的问题。方法1采用二维DP数组,而方法2则使用了一维DP数组,虽然思路不同,但都能达到时间复杂度为O(mn)和空间复杂度为O(n)。作者意识到自己在理解DP应用上的不足,并表示需要更多的练习来提升这方面的能力。

在这里插入图片描述
方法1: 二维dp。思路是这个在这里插入图片描述
这道题目我的想法和答案的区别就在于我认为dp[i][j]表示直到i,j,grid中最大正方形的边长,而答案的意思是dp[i][j]表示正方形的右下脚一定要顶着i,j。我一开始以为他这样做不能遍历所有的正方形区域,但是其实这样是可以的。我觉得这道题不是很难,我应该是要做出来的,但是很可惜,没做出来,dp题还需要多多练习啊。时间复杂mn,空间复杂mn。

class Solution {
    public int maximalSquare(char[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        int[][] dp = new int[m + 1][n + 1];
        for(int i = 1; i <= m; i++){
            for(int j = 1; j <= n; j++){
                if(matrix[i-1][j-1] == '0'){
                    dp[i][j] = 0;
                }else{
                    dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i][j - 1], dp[i - 1][j])) + 1;
                }
            }
        }
        int sideLen = 0;
        for(int[] row : dp){
            for(int num : row){
                sideLen = Math.max(sideLen, num);
            }
        }
        return sideLen * sideLen;
    }
}

方法2: 一维dp。时间复杂mn,空间复杂n。

class Solution {
    public int maximalSquare(char[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        int maxLen = 0;
        int prev = 0;
        int[] dp = new int[n + 1];
        for(int i = 1; i <= m; i++){
            for(int j = 1; j <= n; j++){
                int temp = dp[j];
                if(matrix[i-1][j-1] == '0'){
                    dp[j] = 0;
                }else{
                    dp[j] = Math.min(prev, Math.min(dp[j], dp[j - 1])) + 1;
                    maxLen = Math.max(maxLen, dp[j]);
                }
                prev = temp;
            }
        }
        return maxLen * maxLen;
    }
}

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值