最大正方形
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
题解:动态规划:使用dp[i][j]代表以i,j为右下角只包含1的正方形
首先需要考虑几点
一、当前的dp[i][j]的值和和(i-1,j)(i,j-1),(i-1,j-1)有关,如果当前(i,j)为1
那么需要考虑这三个位置的最小值加上当前的1,在取最小值时确保是正方形
-
状态转移方程:dp(i,j)=min(dp(i−1,j),dp(i−1,j−1),dp(i,j−1))+1
二、我们每次取当前位置的dp[i][j]和一个变量最大正方形进行比较,大于则替换掉成当前的值
*
时间复杂度:O(NM)
空间复杂度:O(MN)
public class maximalSquare {
public static int maximalSquare(char[][] matrix){
int maxSize=0;
if (matrix==null||matrix.length==0||matrix[0].length==0){
return maxSize;
}
int col=matrix[0].length;
int row=matrix.length;
int[][] dp=new int[row][col];
for (int i=0;i<row;i++){
for (int j=0;j<col;j++){
if (matrix[i][j]=='1'){
if (i==0||j==0){
dp[i][j]=1;
}else {
dp[i][j]=Math.min(Math.min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1;
}
}
maxSize=Math.max(maxSize,dp[i][j]);
}
}
return maxSize*maxSize;
}
}