LeetCodeDiary

A Diary for solving LeetCode problems

View on GitHub
'''
Description: 
Autor: Au3C2
Date: 2021-01-08 11:10:15
LastEditors: Au3C2
LastEditTime: 2021-01-08 16:17:47
'''
class Solution:
    def countSquares(self, matrix: List[List[int]]) -> int:
        m, n = len(matrix), len(matrix[0])
        cum = [[0] * (n + 1) for _ in range(m + 1)]
        for i in range(1,m+1):
            for j in range(1,n+1):
                cum[i][j] = cum[i-1][j] + cum[i][j-1] - cum[i-1][j-1] + matrix[i-1][j-1]
        ans = 0
        # for w in range(min(m,n)):
        # fullArea = (w+1)**2
        fullArea = [i**2 for i in range(1,min(m,n)+1)]
        i = 1
        while i <= m:
            j = 1
            while j <= n:
                w = 0
                while i+w<=m and j+w<=n:
                    area = cum[i+w][j+w] - cum[i+w][j-1] - cum[i-1][j+w] + cum[i-1][j-1]
                    if area == fullArea[w]:
                        ans += 1
                    else:
                        break
                    w += 1
                j +=1
            i += 1
                
        return ans
# 动态规划,中等。先求前缀和,再遍历查找
# https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/
class Solution:
    def countSquares(self, matrix: List[List[int]]) -> int:
        m, n = len(matrix), len(matrix[0])
        f = [[0] * n for _ in range(m)]
        ans = 0
        for i in range(m):
            for j in range(n):
                if i == 0 or j == 0:
                    f[i][j] = matrix[i][j]
                elif matrix[i][j] == 0:
                    f[i][j] = 0
                else:
                    f[i][j] = min(f[i][j - 1], f[i - 1][j], f[i - 1][j - 1]) + 1
                ans += f[i][j]
        return ans

# 正常动态规划求法