LeetCode 1277. 統計全爲 1 的正方形子矩陣

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++;
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章