方法一:暴力
- 遍历二维数组,找到等于‘1’的地方开始
- 行和列加一(边界是min(行数-i,列数-j))
- 如果等于‘1’,结果加一
class Solution {
public int maximalSquare(char[][] matrix) {
int res= 0;
if(matrix==null||matrix.length==0||matrix[0].length==0){
return res;
}
int col=matrix[0].length,row=matrix.length;
for(int i = 0;i<row;i++){
for(int j = 0;j<col;j++){
if(matrix[i][j]=='1'){
res=Math.max(res,1);
//选择最小的边
int curmax=Math.min(row-i,col-j);
for(int k=1;k<curmax;k++){
boolean flag=true;
if(matrix[i+k][j+k]=='0'){
break;
}
for(int m = 0;m<k;m++){
if(matrix[i+k][j+m]=='0'||matrix[i+m][j+k]=='0'){
flag=false;
break;
}
}
if(flag){
res=Math.max(res,k+1);
}else{
break;
}
}
}
}
}
return res*res;
}
}
时间复杂度太高了
方法二:DP
dp(i,j)代表以(i,j)为右下角,满足题意的正方形边长的最大值
class Solution {
public int maximalSquare(char[][] matrix) {
int res = 0;
if(matrix==null||matrix.length==0||matrix[0].length==0){
return res;
}
int row=matrix.length,col=matrix[0].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-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
}
res=Math.max(dp[i][j],res);
}
}
}
return res*res;
}
}