题目描述:
给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。
思路:
动态规划
对于一个矩阵,以每个点作为右下角向左上构成正方形,能够成最大正方形的边长
如图:
代码如下:
C++:
class Solution {
public:
int countSquares(vector<vector<int>>& matrix) {
int res=0;
vector<vector<int>>dp(matrix.size()+1,vector<int>(matrix[0].size()+1,0));
for(int i=0;i<matrix.size();i++){
for(int j=0;j<matrix[0].size();j++){
if(matrix[i][j]==1){
dp[i+1][j+1]=min(dp[i][j],min(dp[i+1][j],dp[i][j+1]))+1;
res+=dp[i+1][j+1];
}
}
}
return res;
}
};
python:
class Solution:
def countSquares(self, matrix: List[List[int]]) -> int:
if len(matrix)==0:
return sum(matrix)
rows=len(matrix)+1
cols=len(matrix[0])+1
dp=[[0]*cols for _ in range(rows)]
res=0
for i in range(rows-1):
for j in range(cols-1):
if matrix[i][j]==1:
dp[i+1][j+1]=min(dp[i][j],min(dp[i+1][j],dp[i][j+1]))+1
res+=dp[i+1][j+1]
return res