組合總和(回溯)

2021-10-01 10:57:32 字數 1460 閱讀 1326

思路:回溯法+剪枝法(相當不錯的題目,遞迴三部曲)

1.遞迴什麼時候結束:當target為0時,遞迴結束;

2.每個遞迴的返回值是什麼:每個遞迴結束後表示已經完成了後續的剪枝操作;

3.每級遞迴中要做的事:遍歷選取當前要剪的那個枝,即把當前的所有的數字(枝)依次過一遍(依次壓入、彈出)。

如輸入: candidates = [2, 3, 5, 7],target = 7,所求解集為: [[2, 2, 3],[2,5], [7]]

為了防止出現結果重複的情況(如[2,5]和[5,2]其實是同乙個結果),對原始陣列先進行公升序排序,這樣就能保證當前剪枝的值》=上一次剪枝的值。

每次剪枝都會產生多個新的子遞迴

第一次寫的**如下,發現可以繼續優化:

class

solution

private

: vector

int>> res;

vector<

int> path;

void

combinationsumcore

(vector<

int>

&candidates,

int start,

int target)

for(

int i = start; i < candidates.

size()

; i++

)//核心}}

;

優化後的**如下:

組合總和 回溯演算法

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

LeetCode 回溯 組合總和

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 示例 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3...

演算法 回溯 組合總和3

找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 9 的正整數,並且每種組合中不存在重複的數字。說明 所有數字都是正整數。解集不能包含重複的組合。示例 1 輸入 k 3,n 7 輸出 1,2,4 示例 2 輸入 k 3,n 9 輸出 1,2,6 1,3,5 2,3,4 這段 組合總和...