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

 

posted @ 2019-12-02 19:15  oldby  阅读(220)  评论(0编辑  收藏  举报