LeetCode 1277. 统计全为 1 的正方形子矩阵
题目
给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。
示例 1:
输入:matrix =
[
[0,1,1,1],
[1,1,1,1],
[0,1,1,1]
]
输出:15
解释:
边长为 1 的正方形有 10 个。
边长为 2 的正方形有 4 个。
边长为 3 的正方形有 1 个。
正方形的总数 = 10 + 4 + 1 = 15.
示例 2:
输入:matrix =
[
[1,0,1],
[1,1,0],
[1,1,0]
]
输出:7
解释:
边长为 1 的正方形有 6 个。
边长为 2 的正方形有 1 个。
正方形的总数 = 6 + 1 = 7.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路1
暴力搜索,每次新增一行与一列,把新增的条件全部判断,如果有不满足的,就返回len,如果全部满足,则len ++
思路2
动态规划,一个格子,的最大边长,肯定是取决于它的左边 左上角 上边 这三个格子。并且是这三个值里面最小值
+1(在该格子是1的情况下),很难受,刚写了个四个小时的手工账,脑子糊涂了,理不清怎么归纳证明。先不写,暴
力过了
代码
public class 最大正方形 {
static char[][] map;
public int maximalSquare(char[][] matrix) {
map = matrix;
int max = Integer.MIN_VALUE;
for (int i = 0; i < matrix.length; i ++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] == '1') {
int tmp = find(i, j);
max = Math.max(tmp, max);
}
}
}
return max * max;
}
public static int find(int x, int y) {
int len = 0;
System.out.println("检查"+x+":"+y);
while (true) {
int toX = x + len;
int toY = y + len;
if((toX>=map.length)|| (toY>=map[0].length))return len;
for (int col = y; col <= toY; col++) {
if (map[toX][col] == '0')
return len;
}
for (int row = x; row <= toX; row++) {
if (map[row][toY] == '0')
return len;
}
len++;
}
}
}