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

文章目录

  • 题目描述
  • 思路分析
  • 完整代码

题目描述

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

leetcode(力扣) 221. 最大正方形(动态规划)_第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值了,这也意味着,只有三个条件相等,边长才能变大。
leetcode(力扣) 221. 最大正方形(动态规划)_第2张图片

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
        ```

你可能感兴趣的:(leetcode,动态规划,算法)