如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人的经验 ,比如准备简历实习校招总结offer选择也欢迎来一起参加秋招打卡活动 等;如果你是计算机小白,学习/转行/校招路上感到迷茫或者需要帮助,可以点此联系阿秀;免费分享阿秀个人学习计算机以来的收集到的好资源,点此白嫖;如果你需要《阿秀的学习笔记》网站中求职相关知识点的PDF版本的话,可以点此下载

# 1277. 统计全为 1 的正方形子矩阵 很好的题目

力扣原题链接(点我直达) (opens new window)

给你一个 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.
1
2
3
4
5
6
7
8
9
10
11
12

示例 2:

输入:matrix = 
[
  [1,0,1],
  [1,1,0],
  [1,1,0]
]
输出:7
解释:
边长为 1 的正方形有 6 个。 
边长为 2 的正方形有 1 个。
正方形的总数 = 6 + 1 = 7.
1
2
3
4
5
6
7
8
9
10
11

提示:

  • 1 <= arr.length <= 300
  • 1 <= arr[0].length <= 300
  • 0 <= arr[i][j] <= 1

# 1、经典DP + 剪枝

执行用时:136 ms, 在所有 C++ 提交中击败了85.93%的用户

内存消耗:18.8 MB, 在所有 C++ 提交中击败了50.00%的用户

  int countSquares(vector<vector<int>>& matrix) {

    int row = matrix.size();
	if (row == 0) return 0;
	int col = matrix[0].size();
	int res = 0;
	for (int i = 0; i < row; ++i) {
		for (int j = 0; j < col; ++j) {
			if (matrix[i][j] && i && j) {//直接将
                // i=0,j=0,matrix[i][j] = 0这三种情况去除掉了
				matrix[i][j] += min({matrix[i-1][j-1],matrix[i][j - 1], matrix[i - 1][j]});
			}
			res += matrix[i][j];
		}
	}
	return res;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17