力扣39 組合總和 遞迴 回溯 DFS

2021-10-09 09:48:20 字數 1143 閱讀 6560

給定乙個無重複元素的陣列 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]

]

官方給出的方法是搜尋回溯,利用了遞迴來決定選和不選來確定全部組和,同時remove起到的作用是當找到符合的組和後,將所有add過的刪除掉,還原回來

class

solution

public

void

dfs(

int[

] candidates,

int target, list

> ans, list

combine,

int idx)

if(target ==0)

// 直接跳過

dfs(candidates, target, ans, combine, idx +1)

;// 選擇當前數

if(target - candidates[idx]

>=0)

}}

先對原陣列進行排序arrays.sort(candidates),從左到右找所有可行解,很明顯這就是回溯。同時利用當右側值大於目標值時break來剪枝。

class

solution

public

void

backtrack

(int

candidates,

int start,

int target)

for(

int i=start;i}

力扣 39 組合總和 dfs

不同組合,並以列表形式返回。你可以按任意順序返回這些組合。candidates中的同乙個數字可以無限制重複被選取。如果至少乙個數字的被選數量不同,則兩種組合是不同的。對於給定的輸入,保證和為target的不同組合數少於150個。示例 1 輸入 candidates 2,3,6,7 target 7 ...

力扣39 組合總和

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。有時候剪枝不止需要加上附加條件,還需要對原有資料集進行改動,比如排序。class solution ...

力扣 中等 39 組合總和

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