leetcode 39 組合總和

2021-10-08 10:17:16 字數 1512 閱讀 9430

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取。

說明:所有數字(包括 target)都是正整數。

解集不能包含重複的組合。 

示例 1:

輸入:candidates = [2,3,6,7], target = 7,

所求解集為:

[[7],

[2,2,3]

]示例 2:

輸入:candidates = [2,3,5], target = 8,

所求解集為:

[[2,2,2,2],

[2,3,3],

[3,5]

]1 <= candidates.length <= 30

1 <= candidates[i] <= 200

candidate 中的每個元素都是獨一無二的。

1 <= target <= 500

class solution(object):

def combinationsum(self, candidates, target):

""":type candidates: list[int]

:type target: int

:rtype: list[list[int]]

"""ans =

def backtrack(prevlist, candidates, target):

for i in candidates:

if sum(prevlist) + i == target:

newlist = prevlist[:]

elif sum(prevlist) + i < target:

index = candidates.index(i)

newlist = prevlist[:]

backtrack(newlist, candidates[index:], target)

elif sum(prevlist) + i > target:

break

candidates.sort()

backtrack(, candidates, target)

return ans

這道題可以使用回溯法來遍歷所有的可能結果,因為涉及到大小問題且無重複元素,所以可以先將陣列進行排序來讓演算法變得更加簡單。我們依次對candidates陣列裡的數進行取值,由於是從小到大排序,所以可以避免重複取值的情況。比如對於target = 7,且已有前序列[2]候選序列[2,3,4],在取到第二個值為3時,此時備選序列變成了[2,3],那麼第三個數字只能從3開始取,不能取比3小的數字,比如[2,3,2]是不行的雖然他正好等於target,但是會和[2,2,3]重複,所以只能取[2,3,3]或者[2,3,4]。

注意到判斷條件當當前的和大於目標值時,我們就中斷了迴圈,這相當於剪枝操作,也只有在陣列排序後才能進行這一步。這樣可以減少大量執行時間。

LeetCode 39 組合總和

給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 示例 2 ...

leetcode39 組合總和

參考 class solution if next num.size target num next 0 邊界條件 return 對於每個元素,有兩種處理方式,選當前元素或者不選當前元素 psol.push back num next 選當前元素 search num,next,psol,targe...

LeetCode39組合總和

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...