LeetCode 221 [Maximal Square]

原题

在一个二维01矩阵中找到全为1的最大正方形

样例

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

返回 4

解题思路

  • 动态规划
  • dp[i][j]跟左上,左,上三个位置最大能延伸的正方形边长相关,如果dp[i][j]不等于0,则是三个中的最小值+1
  • 初始化第一行,第一列,然后双层for循环更新

完整代码

class Solution(object):
    def maximalSquare(self, matrix):
        """
        :type matrix: List[List[str]]
        :rtype: int
        """
        if not matrix or not matrix[0]:
            return 0
        width = len(matrix[0])
        height = len(matrix)
        dp = [[0 for i in range(width)] for j in range(height)]
        
        ans = 0
        for i in range(width):
            dp[0][i] = int(matrix[0][i])
            ans = max(ans, dp[0][i])
        for j in range(height):
            dp[j][0] = int(matrix[j][0])
            ans = max(ans, dp[j][0])
        
        for j in range(1, height):
            for i in range(1, width):
                if matrix[j][i] != "0":
                    dp[j][i] = min(dp[j-1][i-1], min(dp[j-1][i], dp[j][i-1])) + 1
                    ans = max(ans, dp[j][i])
                
        return ans * ans

你可能感兴趣的:(LeetCode 221 [Maximal Square])