题目说明:
给定一个N*N的矩阵matrix,在这个矩阵里,只有0和1的两种值,返回边框全是1的最大正方形的边长长度。
示例:
1 | 1 | 1 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 |
0 | 1 | 0 | 1 |
输出 :3
因为
1 | 1 | 1 | |
1 | 1 | ||
1 | 1 | 1 | |
分析:(枚举,遍历所有可能性)
1.最大正方形,一定是从N向下递减。这就要用循环(比如说5->4->3->2->1)
2.遍历数组,判断以该点为顶点能否构成1为边界的方阵。所以就设计到检测四个边框,也要用到循环。
1 public class CopyOfcase4 { 2 3 public static void main(String[] args) { 4 5 int arr[][] = { 6 { 1, 1, 1, 1,1 }, 7 { 1, 0, 1, 0,1 }, 8 { 1, 1, 0, 1,1 }, 9 { 1, 0, 1, 1,1 }, 10 { 1, 1, 1, 1,1 }, 11 }; 12 System.out.println(max(arr, arr.length)); 13 14 } 15 16 static int max(int[][] matrix, int N) { 17 18 int n = N;// 因为N变化,所以赋值给变量 19 while (n > 0) {// 5->4->3->2->1 20 for (int i = 0; i < N; i++) { 21 if (i + n > N) 22 break;// 如果行超过N最大边界就要退出 23 l3: for (int j = 0; j < N; j++) { 24 if (j + n > N) 25 break;// 如果列超过N最大边界就要退出 26 int r = i, c = j; 27 // 检测四条边是否都为1; 28 while (c < j+n) {// 上边,行不变,列增加 29 // 如果改顶点为0,一定构不成全为1的边,继续该行下一点的判断 30 if (matrix[r][c++] == 0) 31 continue l3; 32 } 33 // 当退出while循环时,c已经超数组边界,所以要恢复 34 c--; 35 while (r < i+n) {// 右边,列不变,行增加 36 if (matrix[r++][c] == 0) 37 continue l3; 38 } 39 r--; 40 while (c >= j) {// 下边,行不变,列递减 41 if (matrix[r][c--] == 0) 42 continue l3; 43 } 44 c++; 45 while (r >= i) {// 左边,列不变,行递增 46 if (matrix[r--][c] == 0) 47 continue l3; 48 } 49 return n; 50 } 51 } 52 n--; 53 54 } 55 return 0; 56 } 57 }
上述代码输出 5。
下一篇将退出优化代码,因为现在的时间复杂度是N*N*N*N,只有最后一个N可以优化,检测四条边的while可不可以换成常数阶?
如有错误,望各位园友批评指正,大家一起进步呀。