DP-LeetCode221. 最大正方形

1、题目描述

https://leetcode-cn.com/problems/maximal-square/

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。 

2、代码详解

class Solution(object):
    def maximalSquare(self, matrix):
        if not matrix:
            return 0
        res = 0  # 记录结果
        # 定义dp数组,每个元素代表当前位置可以达到的最大的正方形的边长
        # 长宽都多补了一行一列是为了更方便处理边界上的点也防止越界发生
        m = len(matrix)
        n = len(matrix[0])
        dp = [[0 for _ in range(n + 1)] for _ in range(m + 1)]  # (m+1)*(n+1)
        # 从 dp 的 [1,1] 位置开始遍历
        for i in range(1, m + 1):
            for j in range(1, n + 1):
                # 下面需要将坐标映射回 matrix 中,注意 dp 数组和 matrix 元素对应关系
                if matrix[i - 1][j - 1] == '1':  # 只有 1 才有可能构成正方形
                    if dp[i - 1][j - 1] and dp[i - 1][j] and dp[i][j - 1]:
                        # 如果当前点的左、上、左上都为 1, 才有机会构成更大的正方形
                        dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1
                    else:
                        # 否则说明当前点的左、上、左上不全为1,也就是有0
                        # 那么当前节点构成的最大正方形就是自身构成的边长为 1 的正方形
                        dp[i][j] = 1
                    res = max(res, dp[i][j])
        return pow(res, 2)

matrix = [["1", "0", "1", "0", "0"],
          ["1", "0", "1", "1", "1"],
          ["1", "1", "1", "1", "1"],
          ["1", "0", "0", "1", "0"]]
s = Solution()
print(s.maximalSquare(matrix))  # 4

https://leetcode-cn.com/problems/maximal-square/solution/xiong-mao-shua-ti-python3-dong-tai-gui-hua-dpshu-z/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值