221. Maximal Square -Medium

Question

Given a 2D binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area.

给出一个二维矩阵,元素由0,1组成,找到最大的仅由1组成的正方形,返回其面积大小

Example

given the following matrix:

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

Return 4.

Solution

  • 动态规划解。对于矩阵的每个元素,判断是否能够形成正方形主要看其左边,上边,左上边元素的值,如果都为‘1’,那么就会形成边长为2的正方形。所以根据这个思路我们定义dp[i][j]:以(i,j)为结尾的正方形的最大边长。

    • 如果matrix[i][j] = ‘0’ ,那么代表不可能形成正方形,dp[i][j] = 0

    • 如果matrix[i][j] = ‘1’,那么至少能形成边长为1的正方形,而以它结尾的正方形最大多大的递推式为dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1。假设左,上,左上的坐标的最大正方形边长都为1,那么dp[i][j]就会是2,即一个边长为2的正方形;如果三个边长为0,1,1,那么dp[i][j]就会是1,即它本身(一个边长为1的正方形)

    class Solution(object):
        def maximalSquare(self, matrix):
            """
            :type matrix: List[List[str]]
            :rtype: int
            """
            if len(matrix) == 0: return 0
            dp = [[0 for _ in range(len(matrix[0]) + 1)] for _ in range(len(matrix) + 1)]
            max_size = 0
            for index_r in range(1, len(matrix) + 1):
                for index_c in range(1, len(matrix[0]) + 1):
                    # 当前元素是否为‘1’(因为dp的行列都增加了1,所以这里需要-1)
                    if matrix[index_r - 1][index_c - 1] == '1':
                        dp[index_r][index_c] = min(dp[index_r - 1][index_c], dp[index_r][index_c - 1], 
                                                   dp[index_r - 1][index_c - 1]) + 1
                        max_size = max(max_size, dp[index_r][index_c])  # 记录最大的正方形边长
            return max_size * max_size
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值