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