[英]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.