题目
思路:动态规划
1.状态:dp[i][j]表示以(i,j)为右下角的正方形,最大边长为多少
2.状态转移方程:if(matrix[i][j]=='1') dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
3.边界条件,如果i==0
或j==0
就没有上方、左方、左上方的值,那这个位置本身的值就是最大边长的数值(0就是0,1就是1)
4.初始值dp[i][j]=0
5.输出:max(dp[i][j]),是dp[i][j]的最大值。
具体代码
class Solution {
public int maximalSquare(char[][] matrix) {
if(matrix == null || matrix.length == 0){
return 0;
}
int dp[][] = new int[matrix.length][matrix[0].length];
int max = 0;
for(int i = 0;i < matrix.length;i++){
for(int j = 0;j < matrix[0].length;j++){
if(matrix[i][j] == '1'){
if(i == 0 || j == 0){
dp[i][j] = 1;
}else{
dp[i][j] = Math.min(dp[i][j-1],Math.min(dp[i-1][j],dp[i-1][j-1]))+1;
}
}
max = Math.max(max,dp[i][j]);
}
}
return max*max;
}
}
时间复杂度:O(MN), M,N分别为二维矩阵的行数和列数。
空间复杂度:O(MN)