簡體   English   中英

一個關於動態規划的leetcode問題221

[英]A question on dynamic programming leetcode problem 221

我是 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]?

TL;DR : 改變你對dp的定義

dp = [[0]*rowleng]*colleng

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


為什么? 首先,您正在創建對同一列表引用的 2D列表 在第二個中,您正在創建對唯一列表的引用的二維列表。

(從技術上講,您可以將第二個 lind 重寫為dp = [[0]*rowleng for j in range(colleng)]並獲得相同的結果。)

總而言之,當您將dp聲明為對同一list 的引用列表時,然后當您更改dp[0][0] ,它“也會更改”所有0 < i < len(dp) dp[i][0] 0 < i < len(dp) -- 因為它引用的都是同一個列表。

有關更多信息,請參閱例如意外反映在子列表中的列表更改列表

在您的函數中,您調用此行:

dp[i][j]=1

這將 i 和 j 的項目設置為 1,如果您注意到它調用的部分:

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

您會注意到,在您獲得 1 的情況下,這兩個條件都為真,因為該值覆蓋了您擁有的任何其他值,至少從我所見。

請記住,您正在與 an or而非 an and進行比較,因此如果 i 或 j 為零,則不一定兩者都為零,您最終將覆蓋該值,尤其是在矩陣等於 1 的位置(此處,您的第一列都是一個)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM