Given a 2D binary matrix filled with 0’s and 1’s, find the largest square containing all 1’s and return its area.
For example, given the following matrix:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Return 4.
这道题目可以用动态规划的方法来做。
我的思路是,使用一个二维int数组,mark[i][j]表示以matrix[i][j]为右下角,最大的正方形的边长。如果matrix[i][j]==’0’,那么mark[i][j]==0,如果matrix[i][j]==’1’,就有如下的递推关系:
if(mark[i][j-1]==0||mark[i-1][j]==0){
mark[i][j]=1;
}else if(mark[i][j-1]==mark[i-1][j]){
int k=mark[i][j-1];
if(matrix[i-k][j-k]=='1')
mark[i][j]=k+1;
else
mark[i][j]=k;
}else {
mark[i][j]=Math.min(mark[i][j-1], mark[i-1][j])+1;
}
AP的程序如下:
public int maximalSquare(char[][] matrix) {
int rst=0;
if(matrix==null||matrix.length==0||matrix[0].length==0)
return rst;
int row=matrix.length;
int col=matrix[0].length;
int[][] mark=new int[row][col];
for(int i=0;i<row;i++){
if(matrix[i][0]=='1'){
mark[i][0]=1;
rst=1;
}
}
for(int j=0;j<col;j++){
if(matrix[0][j]=='1'){
mark[0][j]=1;
rst=1;
}
}
for(int i=1;i<row;i++){
for(int j=1;j<col;j++){
if(matrix[i][j]=='1'){
if(mark[i][j-1]==0||mark[i-1][j]==0){
mark[i][j]=1;
}else if(mark[i][j-1]==mark[i-1][j]){
int k=mark[i][j-1];
if(matrix[i-k][j-k]=='1')
mark[i][j]=k+1;
else
mark[i][j]=k;
}else {
mark[i][j]=Math.min(mark[i][j-1], mark[i-1][j])+1;
}
rst=Math.max(rst, mark[i][j]);
}
}
}
return rst*rst;
}