leetcode(力扣) 221. 最大正方形(动态规划)

题目描述

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

在这里插入图片描述

输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
输出:4

思路分析

看了一圈题解,解释的都不太清楚。我来写一个。

这题动规。直接步骤开走。

1.确定dp下标含义:

dp[i][j] 表示为 以i和j为右下角的格子可以组成的正方形的最长边长。

2.递推公式:

dp[i][j]=min(dp[i−1][j−1],dp[i−1][j],dp[i][j−1])+1。
含义为若当前位置为111,则此处可以构成的最大正方形的边长,是其正上方,左侧,和左上界三者共同约束的,且为三者中的最小值加1。

看下面这个图帮助理解,假设当前 i j 遍历到最右下角的0的时候,则此时dp[i][j]也就是算上当前这个格子,可以组成的最长边长,即由图中红蓝绿三个矩形来决定的。
也就是说,这三部分联合到一起,再加上当前遍历的右下角这一个小格子,才算是一个新的正方形,这也是为什么要取三者中的min值了,这也意味着,只有三个条件相等,边长才能变大。
在这里插入图片描述

3.初始化:

初始化比较容易,为了考虑一个格子的情况,也就是所给的matrix 数组第一行和第一列的元素,将dp数组进行扩充,扩充一行一列,这样就能清楚的表示所给矩阵第一行和第一列正方形的情况了。

完整代码

class Solution:
    def maximalSquare(self, matrix: List[List[str]]) -> int:
        # dp[i][j] 为 以i和j为右下角的格子可以组成的正方形的最长
        row = len(matrix)+1
        col = len(matrix[0])+1
        res = 0

        dp = [[0 for _ in range(col)] for _ in range(row)]
        

        for i in range(1,row):
            for j in range(1,col):
                if matrix[i-1][j-1] == '1':
                    dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
                res = max(res,dp[i][j])
        return res * res
        ```

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值