我有使用 BFS 計算最大深度的代碼,它作業正常,但我無法弄清楚如果我替換for i in range(len(q)):
為for i in q:
.
下面的代碼可以正常作業并通過所有測驗:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root: return 0
q = list([root])
level = 0
while q:
for i in range(len(q)):
node = q.pop(0)
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
level = 1
return level
但是下面的代碼for i in q
沒有通過一些測驗:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root: return 0
q = list([root])
level = 0
while q:
for i in q: # the only difference
node = q.pop(0)
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
level = 1
return level
for i in range(len(q)):
并for i in q:
提供完全相同的迭代次數還是我誤解了什么?我不明白為什么它會有所作為......有什么想法嗎?
謝謝你。
uj5u.com熱心網友回復:
for i in range(len(q)):
并且for i in q:
不等價。
您q
通過彈出和附加進行修改。當您在迭代期間修改串列時,內部迭代器的行為是未定義的(通常會跳過一些東西)。
range(len(q))
在開始時只檢查q
一次的長度,然后定義迭代。
uj5u.com熱心網友回復:
這是因為該q.pop(0)
指令還可以q
使您的迭代更短(有關詳細說明,請參見https://stackoverflow.com/a/13939416/10115198)。
它實際上并沒有提供相同數量的迭代!要了解問題:
q = [1, 2, 3]
for i in q:
node = q.pop(0)
print(i, node)
給
1 1
3 2
但
q = [1, 2, 3]
for i in range(len(q)):
node = q.pop(0)
print(i, node)
給
0 1
1 2
2 3
uj5u.com熱心網友回復:
關鍵區別在于for i in range(len(q))
在回圈之前的時間從 q 創建一個新的迭代器(范圍)物件。for i in q
回圈 q 中的專案。您的問題是您實際上是q
在回圈內部使用q.append(...)
and進行修改q.pop(...)
,這可能會產生您所看到的意外行為。
簡單的例子——這將永遠回圈:
l = [1, 2, 3]
for i in l:
print(i)
l.append(999)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470682.html