Max Square
Example
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0Note
1. for向左都是1的长度
2. for向上都是1的长度
3. for左上点的最大正方形的边长Code
滚动数组优化
Last updated
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 01. for向左都是1的长度
2. for向上都是1的长度
3. for左上点的最大正方形的边长Last updated
if matrix[i][j] == 1
f[i][j] = min(LEFT[i][j-1], UP[i-1][j], f[i-1][j-1]) + 1;
if matrix[i][j] == 0
f[i][j] = 0绿色的B, 黑色的C和粉色的D全都为1并且A自己的最右下角点为1if matrix[i][j] == 1
f[i][j] = min(f[i - 1][j], f[i][j-1], f[i-1][j-1]) + 1;
if matrix[i][j] == 0
f[i][j] = 0public class Solution {
/**
* @param matrix: a matrix of 0 and 1
* @return: an integer
*/
public int maxSquare(int[][] matrix) {
// write your code here
int ans = 0;
if (matrix == null || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0) {
return 0;
}
int n = matrix.length, m = matrix[0].length;
int[][] res = new int[n][m];
for (int i = 0; i < n; i++) {
res[i][0] = matrix[i][0];
ans = Math.max(res[i][0], ans);
for (int j = 1; j < m; j++) {
if (i > 0) {
if (matrix[i][j] > 0) {
res[i][j] = 1 + Math.min(res[i - 1][j],
Math.min(res[i][j - 1],
res[i - 1][j - 1]));
} else {
res[i][j] = 0;
}
} else {
res[i][j] = matrix[i][j];
}
ans = Math.max(res[i][j], ans);
}
}
return ans*ans;
}
}if matrix[i][j] == 1
f[i%2][j] = min(f[(i - 1)%2][j], f[i%2][j-1], f[(i-1)%2][j-1]) + 1;
if matrix[i][j] == 0
f[i%2][j] = 0f[i%2][0] = matrix[i][0];
f[0][j] = matrix[0][j];max{f[i%2][j]}public class Solution {
/**
* @param matrix: a matrix of 0 and 1
* @return: an integer
*/
public int maxSquare(int[][] matrix) {
if(matrix==null || matrix.length==0 || matrix[0]==null || matrix[0].length==0) {
return 0;
}
int n = matrix.length, m = matrix[0].length;
int[][] dp = new int[n][m];
int maxEdge = 0;
for (int i = 0; i < m; i++) {
dp[0][i] = matrix[0][i];
if (matrix[0][i] > maxEdge) {
maxEdge = matrix[0][i];
}
}
for (int i = 1; i < n; i++) {
dp[i % 2][0] = matrix[i][0];
for (int j = 1; j < m; j++) {
if (matrix[i][j] == 1) {
dp[i % 2][j] = Math.min(dp[(i - 1) % 2][j - 1],
Math.min(
dp[i % 2][j - 1],
dp[(i - 1) % 2][j]
)
) + 1;
}
else {
dp[i % 2][j] = 0;
}
if (dp[i % 2][j] > maxEdge) {
maxEdge = dp[i % 2][j];
}
}
}
return maxEdge * maxEdge;
}
}