LeetCode 回溯 組合總和

2022-08-20 09:45:07 字數 1047 閱讀 1507

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

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

說明:

示例:

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

所求解集為:

[ [7],

[2,2,3]

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

所求解集為:

[  [2,2,2,2],

[2,3,3],

[3,5]

]

使用回溯來做,使用變數cursum來記錄當前的和,如果cursum==target則將當前的數字加入到答案中,因為candidates中的數字全為整數,所以如果cursum>target的話,可以直接return(剪枝)。又因為每個元素可以被重複選擇多次,所以每次都從變數start開始遍歷陣列candidates,並將start初始化為0.**如下:

class solution };

vectortrack;

int cursum = 0;

dfs(candidates, 0, cursum, target, track);

return ans;

}void dfs(vector& candidates, int start, int cursum, int target, vectortrack)

if(cursum>target) return;

for(int i=start; i如果不設定start變數,每次遞迴都從0開始就會產生重複的結果,例如([2,3,6,7], 7)會產生[2,2,3],[2,3,2],[3,2,2],[7]四個結果,第2和第3個結果與第1個結果是重複的,重複的原因是遍歷到3的時候,考慮了3之前的變數2。通過設定start變數,每次迴圈都從start變數開始,不再考慮start之前的變數,避免了重複。

組合總和(回溯)

思路 回溯法 剪枝法 相當不錯的題目,遞迴三部曲 1.遞迴什麼時候結束 當target為0時,遞迴結束 2.每個遞迴的返回值是什麼 每個遞迴結束後表示已經完成了後續的剪枝操作 3.每級遞迴中要做的事 遍歷選取當前要剪的那個枝,即把當前的所有的數字 枝 依次過一遍 依次壓入 彈出 如輸入 candid...

組合總和 回溯演算法

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。defcombination...

LeetCode 組合總和 II 重點整理回溯法

給定乙個陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的每個數字在每個組合中只能使用一次。說明 示例 1 輸入 candidates 10,1,2,7,6,1,5 target 8,所求解集為 1,7 1,2,...