【题目】给定一个N*N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度。
public class MatrixBorder1 {
public void setBorderMap(int[][] m, int[][] right, int[][] down) {
int r = m.length;
int c = m[0].length;
if (m[r - 1][c - 1] == 1) {
right[r - 1][c - 1] = 1;
down[r - 1][c - 1] = 1;
}
for (int i = r - 2; i > -1; i--) {
if (m[i][c - 1] == 1) {
right[i][c - 1] = 1;
down[i][c - 1] = down[i + 1][c - 1] + 1;
}
}
for (int i = c - 2; i > -1; i--) {
if (m[r - 1][i] == 1) {
right[r - 1][i] = right[r - 1][i + 1] + 1;
down[r - 1][i] = 1;
}
}
for (int i = r - 2; i > -1; i--) {
for (int j = c - 2; j > -1; j--) {
if (m[i][j] == 1) {
right[i][j] = right[i][j + 1] + 1;
down[i][j] = down[i + 1][j] + 1;
}
}
}
}
public int getMaxSize(int[][] m) {
int[][] right = new int[m.length][m[0].length];
int[][] down = new int[m.length][m[0].length];
setBorderMap(m, right, down);
for (int i = Math.min(m.length, m[0].length); i > -1; i--) {
if (hasBorderMap(i, right, down)) {
return i;
}
}
return 0;
}
public boolean hasBorderMap(int size, int[][] right, int[][] down) {
for (int i = 0; i < right.length - size + 1; i++) {
for (int j = 0; j < down[0].length - size + 1; j++) {
if (right[i][j] >= size && down[i][j] >= size && down[i][j + size - 1] >= size
&& right[i + size - 1][j] >= size) {
return true;
}
}
}
return false;
}
}