LeetCode 热题 HOT 100 (006/100)【宇宙最简单版】

【动态规划】No. 0221 最大正方形【中等】👉力扣对应题目指路

希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
欢迎关注、订阅专栏 【力扣详解】谢谢你的支持!

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

  • 示例: 如下二维矩阵,返回 2x2=4

🔥 思路:采用动态规划,建立二维 dp 数组,利用每个元素左上角的 dp 数组推导其自身 dp 值


参考如上思路,给出详细步骤如下:

  • 步骤一⭐确定 dp 数组含义:二维 dp 数组
    • dp[i][j] 的含义为:以 matrix[i][j] 为右下角的最大正方形的边长 【💥 重要】
  • 步骤二⭐确定 dp 推导方式:由自身左上的元素推导得到
    • 如果当前对应 matrix[i][j] 中的值为 0,说明以 matrix[i][j] 为右下角的最大正方形的边长为 0dp[i][j]=0
    • 如果当前对应 matrix[i][j] 中的值非 0,则为 上、左、左上、三者对应的最小正方形边长 + 1: min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
      • 从特例理解:三者相等均为 dp[i-1][j-1]:当前matrix[i][j] 补齐了新大正方形的右下角 ◲
      • min: 不相等时,只能维持最短的边长,所以取 min
      • +1:由于 matrix[i][j] 处的 1 拓展了一个单位的边长
  • 步骤三⭐根据 dp 数组含义,初始化 dp 数组:完全 copy matrix 中的值即可
    • 由左上角推导,所以只需要关注最左侧、最上侧的 dp 初值
      • matrix 中为 0 说明对应的最大正方形边长为 0
      • matrix 中为 1 说明对应的最大正方形边长为 1
    • 根据推导公式,其他位置得初值会被覆盖、任意数均可(本代码中直接 copy 了 matrix)
class Solution:
    def maximalSquare(self, matrix: List[List[str]]) -> int:
        result = 0
        dp = [[] for i in range(len(matrix))]  # ------------------------------- step 1
        for i in range(len(matrix)):  ## 填充 dp 初值  # ------------------------ step 3
            for j in range(len(matrix[0])):
                dp[i].append(int(matrix[i][j]))
                if matrix[i][j] == "1" and result == 0:  ## 更新 result 初值
                    result = 1
          # -------------------------------------------------------------------- step 2
        for i in range(1,len(matrix)):
            for j in range(1,len(matrix[0])):
                if matrix[i][j] == "0":  # ----------------------------------- step 2.1
                    # 不需要更新,还是保持 0
                    continue  ## 注意是 continue
                dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1  # -- step 2.2   
                result = max(result, dp[i][j])

        return result**2

希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
欢迎关注、订阅专栏 【力扣详解】谢谢你的支持!
🔥 LeetCode 热题 HOT 100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值