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

2009

被折叠的 条评论
为什么被折叠?



