动态规划(基础版)第十二题221. 最大正方形

​​class Solution(object):
    def maximalSquare(self, matrix):
        if not matrix or not matrix[0]:
            return 0
        
        m, n = len(matrix), len(matrix[0])
        dp = [[0] * (n + 1) for _ in range(m + 1)]
        max_area = 0
  
        for i in range(1, m + 1):
            for j in range(1, n + 1):
                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
                    current_area = dp[i][j] ** 2
                    if current_area > max_area:
                        max_area = current_area
        return max_area
if not matrix or not matrix[0]:
            return 0

    首先检查输入的矩阵 matrix 是否为空或者第一行是否为空。如果满足其中任一条件,会立即返回 0,因为在一个空矩阵中无法找到正方形。

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

检查当前元素是否为 '1'。如果是,我们才考虑更新 dp[i][j] 第二行动态规划公式更新 dp[i][j]。它取左、上、和左上三个相邻位置的最小边长,并加 1,得到以当前位置为右下角的最大正方形的边长。

然后计算当前正方形面积,如果当前面积大于最大面积,这行更新 max_area 为当前面积。最后返回找到的最大正方形的面积。

这里有张官方的图更为直观:

    最近期末周,很久没写题了。看到这题第一个想法是先创建一个面积列表1.先确定二位矩阵的中最小边a,即正方形最大边长。2.设i从(1,a)开始循环看是否有对应的正方形之和为4^(i-1),有即将对应和放入面积列表。3.如果循环中有值找不到对应面积和,直接退出输出面积列表最后一个值。

但是我该如何确定是否有存在的正方形呢?我打算先穷举,从上到下从左到右,存在相应面积即退出进入下一轮循环(i+1)。但我发现这样并不好操作,首先不确定中心点坐标,其次不确定周围范围。一个循环好像解决不了,而且并没有用到动态规划。另外,我们不能确定i是在左半边正方形还是右半边正方形,也就是说大范围也不确定。

我又想到是否可以通过上一次的点作为中心点,拓展周围范围呢?

这是第一次写出的代码,修改逻辑错误后能运行,但似乎只有为0的示例能正常输出。

这里修改了for循环中的i,j范围,原本写的+1显示超范围,于是我删掉了,后来发现是m,n弄反了,修改后没有恢复原本的范围,导致范围小了。

现在为1的情况也能成功,但是大面积还是不行。

对于循环条件:如果上述条件为假(即 list1 不为空且不存在四倍关系),这行将返回 list1 中的最后一个面积。然而,这个逻辑是错误的,因为它会在找到第一个不满足四倍关系的面积时立即返回,而不是继续搜索最大面积。所以这个想法放弃。根据题目的要求,我们实际上只需要遍历 dp 矩阵一次,找到最大的边长,并返回其平方作为最大正方形的面积。不需要使用 list1 列表或检查面积之间的四倍关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值