题目如下:
Given a 2D binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area.
Example:
Input:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Output: 4
就是给定一个二维数组 求出他的最大一个正方形的面积 (正方形是由1构成的图形,必须要连续,外加是正方形)
一开始尝试DFS解决(可行) 但是 顶不住 写不出来 后面采用了一个时间复杂度较高但是好理解的算法
先求出正方形最大可能的边长 :int r = matrix.length; 二维数组的行数
int c = matrix[0].length; 二维数组的列数
int len = Math.min(r, c); 最大值是这两个的较小值(因为是正方形)
然后从1开始逐步增加边长的值 判断是否构成的是正方形
判断是否正方形代码如下:
int r = matrix.length;
int c = matrix[0].length;
int len = Math.min(r, c);
总代吗如下:(看代码⑧ 解释太麻烦)
public static int maximalSquare(char[][] matrix) {
if(matrix.length == 0) {
return 0;
}
if(matrix.length == 1) {
for(int i=0;i<matrix[0].length;i++) {
if(matrix[0][i] == '1') {
return 1;
}
}
}
int max = 0;
int r = matrix.length;
int c = matrix[0].length;
int len = Math.min(r, c);
boolean flag = true;
for(int a=0;a<len;a++) {
flag = false;
for(int i=0;i+a<r;i++) {
if(flag) {
break;
}
for(int j=0;j+a<c;j++) {
if(isSquare(matrix,i,j,a)) {
max = Math.max(max, (a+1)*(a+1));
flag = true;
break;
}
}
}
}
return max;
}
public static boolean isSquare(char[][] m,int r,int c,int len) {
for(int i=r;i<=r+len;i++) {
for(int j=c;j<=c+len;j++) {
if(m[i][j] == '0') {
return false;
}
}
}
return true;
}