思路:
动态规划dp
代码:
class Solution {
public int maximalSquare(char[][] matrix) {
int max=0;
if(matrix==null||matrix.length==0||matrix[0].length==0){
return max;
}
int m=matrix.length;
int n=matrix[0].length;
int[][] dp=new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j]=='1'){
if(i==0||j==0){
//如果i或j中有一个为0,则最大面积只可能为1
dp[i][j]=1;
}
else{
dp[i][j]=Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
}
}
max=Math.max(max,dp[i][j]);
}
}
return max*max;
}
}
分解:
1)状态转移方程:
在左、上、左上的方位中选择dp最小的+1
dp[i][j]=Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
2)如果i或j中有一个为0,则最大面积只可能为1
复杂度分析:
时间复杂度:O(M*N)
空间复杂度:O(M*N)