标签:with || ble 最大 遍历 href return 不为 个数
给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 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.
输入:matrix =
[
[1,0,1],
[1,1,0],
[1,1,0]
]
输出:7
解释:
边长为 1 的正方形有 6 个。
边长为 2 的正方形有 1 个。
正方形的总数 = 6 + 1 = 7.
题目链接: https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/
做这题之前,可以先做一下最大正方形。
和最大正方形基本一样。使用动态规划来做,思路如下:
最后遍历 dp 矩阵,如果 dp[i][j] 不为 0,就把 dp[i][j] 加入到结果当中。
代码如下:
class Solution {
public:
int countSquares(vector<vector<int>>& matrix) {
if(matrix.empty() || matrix[0].empty()) return 0;
int rows = matrix.size();
int cols = matrix[0].size();
vector<vector<int>> dp(rows, vector<int>(cols, 0));
int ans = 0;
for(int i=0; i<rows; i++){
for(int j=0; j<cols; j++){
if(matrix[i][j]==1){
if(i==0 || j==0) dp[i][j] = 1;
else{
dp[i][j] = min(min(dp[i-1][j], dp[i-1][j-1]), dp[i][j-1]) + 1;
}
}
if(dp[i][j]!=0) ans += dp[i][j];
}
}
return ans;
}
};
标签:with || ble 最大 遍历 href return 不为 个数
原文地址:https://www.cnblogs.com/flix/p/12853756.html