在一个二维01矩阵中找到全为1的最大正方形
样例
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
返回 4
思路:
因为是求正方形,所以只要求正方形的边长就可以(这样比用面积表示更方便)。
动态规划:
转移方程:
如果matrix[i][j]=0,dp[i][j] = 0;
否则dp[i][j] =1+ Math.min(Math.min(dp[i-1][j-1],dp[i][j-1]), Math.min(dp[i-1][j-1],dp[i-1][j])); 其中dp[i][j]表示以(i, j)为右下顶点的正方形的边长
代码:
public class Solution {
/**
* @param matrix: a matrix of 0 and 1
* @return: an integer
*/
public int maxSquare(int[][] matrix) {
// write your code here
int row=matrix.length,col=matrix[0].length;
int[][] dp = new int[row][col];//len_Edge
int R=0;
for(int i=0;i<row;++i)
for(int j=0;j<col;++j){
dp[i][j] = matrix[i][j];
if(i>0&&j>0&&dp[i][j]>0&&dp[i-1][j-1]>0){
dp[i][j] += Math.min(Math.min(dp[i-1][j-1],dp[i][j-1]),
Math.min(dp[i-1][j-1],dp[i-1][j]));
}
R = Math.max(dp[i][j],R);
}
return R*R;
}
}