统计全为1的正方形子矩阵Java
文章发布较早,内容可能过时,阅读注意甄别。
# 题目
给你一个 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.
提示:
- 1 <= arr.length <= 300
- 1 <= arr[0].length <= 300
- 0 <= arr[i][j] <= 1
# 思路
# 解法
class Solution {
public int countSquares(int[][] matrix) {
int row=matrix.length;
int col=matrix[0].length;
int dp[][]=new int[row][col];
int count=0;
for(int i=0;i<row;i++){
if(matrix[i][0]==1){
dp[i][0]=1;
count++;
}
}
for(int j=1;j<col;j++){
if(matrix[0][j]==1){
dp[0][j]=1;
count++;
}
}
for(int i=1;i<row;i++){
for(int j=1;j<col;j++){
if(matrix[i][j]==1){
dp[i][j]=1;
if(dp[i-1][j]!=0&&dp[i][j-1]!=0&&dp[i-1][j-1]!=0){
dp[i][j]=Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
}
count+=dp[i][j];
}
}
}
return count;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 总结
- 分析出几种情况,然后分别对各个情况实现