給定乙個無重複元素的陣列 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]
]這道題目是求集合,並不是求極值,因此動態規劃不是特別切合。這種題目其實有乙個通用的解法,就是回溯法,回溯法其實**於深度優先搜尋dfs,模板:
1, 以當前位置為源流往下摸排所有可以跳到的位置
2, 最終遞迴返回源流位置
3, 然後再以下面乙個位置作為源流位置,重複上述操作
class
solution
:def
combinationsum
(self, candidates: list[
int]
, target:
int)
-> list[list[
int]]:
# 先排序,便於後面剪枝
candidates.sort(
)# 最終結果集合
res =
# temp用來記錄路徑
temp =
self.dfs(res,candidates, temp, target,0)
return res
# 記住回溯法的模板
defdfs
(self, res, candidates, temp, target, index)
:# target為剩餘和,從candidates的index開始往下摸排,temp為路徑記錄
# 遞迴邊界
# 當滿足節點和等於target的時候(剩餘和=0),
# 此時路徑中的所有節點可以算是一條符合要求的路徑,可加入最終結果集合,
# 然後return
if target ==0:
))return
# 剪枝
# 因為事先已經排序過了,所以當剩餘和為負數的時候(路徑中最後乙個節點,
# 也就是最大的那個,如果都比剩餘和大的話,剩餘要摸排的也就是index及以後的節點,
# 會更大,導致剩餘和為負),
# 再往下摸排只會讓剩餘和越來越小,此時不需要再往下查詢了,return
elif
(temp and target < temp[-1
]):return
for i in
range
(index,
len(candidates),1
):# 把當前節點加入路徑
)# 以這個節點為源往下摸排,看看再加入哪些節點能滿足節點和等於target
self.dfs(res, candidates, temp, target-candidates[i]
, i)
# 這條源流摸排結束,將這個節點彈出,再加入下乙個節點並以此為源重新往下摸排
temp.pop(
)
LeetCode 39 組合總數
給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 輸入 candidates...
leetcode 39組合總數 python
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...
leetcode 39 組合總數(回溯)
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明當我看到這道題目的時候,當我看到要得到所有結果的組合,我二話沒說,立馬開始寫 了,一下是我寫的 ...