leetcode-165周赛-1277-统计全为1的正方形子矩阵
题目描述:
自己的提交:
class Solution: def countSquares(self, matrix: List[List[int]]) -> int: if not matrix: return 0 m,n = len(matrix),len(matrix[0]) dp = [0] + [0] * m * n for i in range(m): for j in range(n): dp[i*n+j+1] = dp[i*n+j] layer = min(i,j) for l in range(layer+1): flag = True for i_ in range(i-l,i+1): if matrix[i_][j-l] == 0: flag = False for j_ in range(j-l,j+1): if matrix[i-l][j_] == 0: flag = False if flag == False: break dp[i*n+j+1] += 1 return dp[-1]
优化: O(N^2)
class Solution: def countSquares(self, matrix: List[List[int]]) -> int: n = len(matrix) m = len(matrix[0]) dp = [[0] * m for _ in range(0, n)] ret = 0 for i in range(0, n): for j in range(0, m): if matrix[i][j] == 0: continue dp[i][j] = 1 if i == 0 or j == 0: ret += dp[i][j] continue sub = min(dp[i - 1][j], dp[i][j - 1]) if sub != 0: if matrix[i - sub][j - sub] == 1: dp[i][j] = sub + 1 else: dp[i][j] = sub ret += dp[i][j] return ret
再优化:
class Solution(object): def countSquares(self, A): R, C = len(A), len(A[0]) dp = [[0] * (C+1) for _ in range(R+1)] ans = 0 # largest square ending here for r, row in enumerate(A): for c, val in enumerate(row): if val: dp[r+1][c+1] = min(dp[r][c], dp[r][c+1], dp[r+1][c]) + 1 ans += dp[r+1][c+1] return ans