【问题标题】:A question on dynamic programming leetcode problem 221一个关于动态规划的leetcode问题221
【发布时间】:2021-10-22 14:40:15
【问题描述】:

我是 Python 的初学者。以下是我对leetcode 221(最大平方)的代码,它只能通过30多个测试样本。它在矩阵中失败: M=[["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]

def maximalSquare(matrix):
    colleng=len(matrix)
    rowleng=len(matrix[0])
    maxsqlst=[]
    dp=[[0]*rowleng]*colleng
    for i in range(colleng):
        for j in range(rowleng):
            if matrix[i][j]=='1':
                if i==0 or j==0:
                    print('A',i,j,dp)
                    dp[i][j]=1
                    print('B',i,j,dp)
                else:
                    dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
            print(i,j,dp)
        maxsqlst.append(max(dp[i]))

    return max(maxsqlst)**2

通过插入一些print()命令,发现i=j=0时出错,

A 0 0 [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
B 0 0 [[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]].

为什么第一个列是 1 而不是 dp[0][0]?

【问题讨论】:

  • 问题是什么?
  • 感谢您的评论!当 i=j=0 时,我希望它只设置 dp[0][0] 为 1,但它实际上将 dp 的第一个列设置为 1。为什么会发生这种情况?@drum

标签: python dynamic-programming


【解决方案1】:

TL;DR:将 dp 的定义从

dp = [[0]*rowleng]*colleng

dp = [[0 for i in range(rowleng)] for j in range(colleng)]


为什么?首先,您要创建一个对同一列表的引用的二维列表;在第二个中,您将创建一个对唯一列表的引用的二维列表。

(从技术上讲,您可以将第二个 lind 重写为 dp = [[0]*rowleng for j in range(colleng)] 并获得相同的结果。)

话虽如此,当您声明dp 是对相同列表 的引用列表时,当您更改dp[0][0] 时,它“也会更改”dp[i][0] 0 < i < len(dp) -- 因为引用的都是同一个列表。

参见例如List of lists changes reflected across sublists unexpectedly 了解更多信息。

【讨论】:

  • 非常感谢!
【解决方案2】:

在您的函数中,您调用此行:

dp[i][j]=1

这会将 i 和 j 的项目设置为 1,如果你注意到它被调用的部分:

if matrix[i][j]=='1':
    if i==0 or j==0:

您会注意到,在您得到 1 的情况下,这两个条件都为真,因为此值会覆盖您拥有的任何其他值,至少从我所看到的情况来看是这样。

请记住,您是在与 or 而不是 and 进行比较,因此如果 i 或 j 之一为零,则不一定 both,您最终会覆盖该值,尤其是在矩阵等于 1 的位置(这里,您的第一列全为 1)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2011-10-17
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多