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