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.Example
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]
Notice
Only consider the main diagonal situation.
Analysis:A DP problem. We define dp[i][j] the max length of square which diagonal is all 1 and others is 0.
So dp[i][j] depends on three things:
a. dp[i - 1][j - 1],
b. the number of contiguous 0s starting from matrix[i][j - 1] to left
c. the number of contiguous 0s starting from matrix[i - 1][j] to top
the dp[i][j] = min(dp[i - 1][j - 1], a, b) + 1;
Code (Java):
public class Solution {
/**
* @param matrix: a matrix of 0 an 1
* @return: an integer
*/
public int maxSquare2(int[][] matrix) {
if (matrix == null || matrix.length == 0) {
return 0;
}
int maxLen = 0;
int m = matrix.length;
int n = matrix[0].length;
int[][] rowZeros = new int[m][n]; // most contignous zeros
int[][] colZeros = new int[m][n];
int[][] dp = new int[2][n];
for (int i = 0 ; i< m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 1) {
rowZeros[i][j] = 0;
colZeros[i][j] = 0;
} else {
rowZeros[i][j] = j == 0 ? 1 : rowZeros[i][j - 1] + 1;
colZeros[i][j] = i == 0 ? 1 : colZeros[i - 1][j] + 1;
}
}
}
for (int i = 0; i < n; i++) {
dp[0][i] = matrix[0][i];
maxLen = Math.max(maxLen, dp[0][i]);
}
int cur = 0;
int old = 0;
for (int i = 1; i < m; i++) {
old = cur;
cur = 1 - cur;
dp[cur][0] = matrix[i][0];
maxLen = Math.max(maxLen, dp[cur][0]);
for (int j = 1; j < n; j++) {
if (matrix[i][j] == 0) {
dp[cur][j] = 0;
} else {
dp[cur][j] = Math.min(dp[old][j - 1], Math.min(rowZeros[i][j - 1], colZeros[i - 1][j])) + 1;
}
maxLen = Math.max(maxLen, dp[cur][j]);
}
}
return maxLen * maxLen;
}
}
No comments:
Post a Comment