首页 > 其他 > 详细

leetcode-165周赛-1277-统计全为1的正方形子矩阵

时间:2019-12-02 20:14:46      阅读:194      评论:0      收藏:0      [点我收藏+]

题目描述:

技术分享图片

 

 

 技术分享图片

 

 

 自己的提交:

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

 

leetcode-165周赛-1277-统计全为1的正方形子矩阵

原文:https://www.cnblogs.com/oldby/p/11972729.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!