import java.lang.Math;
class Solution {
/*
动态规划,用前面的结论判断后面的情况。
dp[i][j]表示的是以matrix[i][j]为右下角的最大的正方形的边长。
dp[i][j]等于(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])中的最小值+1.
*/
public int maximalSquare(char[][] matrix) {
int row=matrix.length;
if(matrix==null||row<1){//空矩阵的判断条件,当是空矩阵返回0.
return 0;
}
int col=matrix[0].length;
int [][]dp=new int[row][col];
int max=0;//max保存最大的正方形边长。
//注意:若max=1;当输入的全是0,会返回1,这样就错了。
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(matrix[i][j]=='0'){//注意是字符'0',不是数字0
dp[i][j]=0;
}else if(i==0||j==0){
dp[i][j]=1;
}else{
int tmp=Math.min(dp[i-1][j-1],dp[i-1][j]);
dp[i][j]=1+Math.min(dp[i][j-1],tmp);
}
max=Math.max(max,dp[i][j]);//不能只放到else里面,如下面
/*若else写成下面这样,当输入['1']会返回0,结果是错误的。应该把
max=Math.max(max,dp[i][j])提到外面来,或者放到每一个if,else里面。
else{
int tmp=Math.min(dp[i-1][j-1],dp[i-1][j]);
dp[i][j]=1+Math.min(dp[i][j-1],tmp);
max=Math.max(max,dp[i][j]);
}
*/
}
}
return max*max;
}
}
动态规划中等 leetcode221. 最大正方形
最新推荐文章于 2024-10-18 10:39:20 发布