leetcode39 組合總數

2021-10-03 18:34:44 字數 1724 閱讀 1500

給定乙個無重複元素的陣列 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 中的數字可以無限制重複被選取。說明當我看到這道題目的時候,當我看到要得到所有結果的組合,我二話沒說,立馬開始寫 了,一下是我寫的 ...