标签:sample highlight only public output int 最小值 binary ++i
Given a 2D binary matrix filled with 0
‘s and 1
‘s, find the largest square which diagonal is all 1
and others is 0
.
Only consider the main diagonal situation.
Example 1:
Input:
[[1,0,1,0,0],[1,0,0,1,0],[1,1,0,0,1],[1,0,0,1,0]]
Output:
9
Explanation:
[0,2]->[2,4]
Example 2:
Input: [[1,0,1,0,1],[1,0,0,1,1],[1,1,1,1,1],[1,0,0,1,0]] Output: 4 Explanation: [0,2]->[1,3]
思路:动态规划,u和l数组分别代表左边三角形的最大值和上方三角形的最大值,而f代表对角线到此点的最大长度。
直接三者求最小值转移即可。
public int maxSquare2(int[][] matrix) { // write your code here int n = matrix.length; if (n == 0) return 0; int m = matrix[0].length; if (m == 0) return 0; int[][] f = new int[n][m]; int[][] u = new int[n][m]; int[][] l = new int[n][m]; int length = 0; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) { if (matrix[i][j] == 0) { f[i][j] = 0; u[i][j] = l[i][j] = 1; if (i > 0) u[i][j] = u[i - 1][j] + 1; if (j > 0) l[i][j] = l[i][j - 1] + 1; } else { u[i][j] = l[i][j] = 0; if (i > 0 && j > 0) f[i][j] = Math.min(f[i - 1][j - 1], Math.min(u[i - 1][j], l[i][j - 1])) + 1; else f[i][j] = 1; } length = Math.max(length, f[i][j]); } return length * length; } }
标签:sample highlight only public output int 最小值 binary ++i
原文地址:https://www.cnblogs.com/FLAGyuri/p/12078292.html