盡管看起來幾乎相同,但我一直在絞盡腦汁想弄清楚為什么這兩種方法可以解決 Leetcode 問題(組合求和)。第一種方法(作業)采用似乎不必要的額外引數。我已經用列印陳述句檢查了我的代碼,并找到了所需總數的子集,但由于某種原因,結果沒有正確附加到res. 它不是附加有效的子集,而是附加一個空串列。我確信答案很簡單,但我似乎無法找到邏輯上的區別。這里有兩種方法:
def combinationSumWorking(candidates, target):
result = []
def combinationUtil(index, numbers, sumSoFar):
if sumSoFar > target:
return
if sumSoFar == target:
#print("working",numbers)
result.append(numbers)
return
for i in range(len(candidates)):
combinationUtil(i, numbers [candidates[i]], sumSoFar candidates[i])
combinationUtil(0,[],0)
return result
def combinationSumMine(candidates, target):
res = []
def findCombos(subset):
if(sum(subset) > target):
subset = []
return
if(sum(subset) == target):
res.append(subset)
#print("mine",subset)
subset = []
return
for i in range(len(candidates)):
subset.append(candidates[i])
findCombos(subset)
subset.pop()
findCombos([])
return res
print(combinationSumMine([2,3,6,7],7))
print(combinationSumWorking([2,3,6,7],7))
結果是:
[[], [], [], []]
[[2, 2, 3], [2, 3, 2], [3, 2, 2], [7]]
uj5u.com熱心網友回復:
你的問題是做追加,然后遞回呼叫,然后彈出。我馬上解釋。這是獲得預期結果的代碼版本:
def combinationSumMine(candidates, target):
res = []
def findCombos(subset):
if(sum(subset) > target):
return
if(sum(subset) == target):
res.append(subset)
return
for i in range(len(candidates)):
findCombos(subset [candidates[i]] )
findCombos([])
return res
print(combinationSumMine([2,3,6,7],7))
發生的事情是,您遍歷候選串列,將新值附加到您的子集串列,然后進行遞回呼叫。因此,當該遞回呼叫執行時,它會使用您已將其中一個候選者添加到的串列執行。同樣,當您找到結果時,或者如果您找到結果,則將相同的“子集”串列附加到您的結果中。當您“彈出”一個值時,就是從結果中的子集中彈出它。這就是為什么你總是會回傳一個空的答案。
您想要做的是創建子集串列的副本。在我的示例中,這樣做的一種方法是,不是向 findCombos 函式提供子集串列,而是提供將子集串列連接到包含我們要考慮的新元素的串列的結果。這是一個全新的清單!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/337432.html
上一篇:Bash遞回函式沒有正確執行
