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++;
}
}
}