演算法 回溯 貪心 組合總和

2021-10-06 01:15:57 字數 2115 閱讀 4239

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

]這段**組合總和-解題思路

回溯法的解體框架是什麼呢,解決乙個回溯問題,實際上就是乙個決策樹的遍歷過程。一般來說,我們需要解決三個問題:

其中最關鍵的點就是:在遞迴之前做選擇,在遞迴之後撤銷選擇。

linkedlist result =

newlinkedlist()

;public

void

backtrack

(路徑,選擇列表)

for(選擇:選擇列表)

}

class

solution

private

void

backtrack

(int

candidates,

int target,

int start, arraylist

tmplist,

int tmp)

// 否則tmp < target,還需要繼續加數字

// 所以這裡必須要複製乙份tmplist,避免和上一層遞迴該list互相影響

arraylist

newlist =

newarraylist

<

>

(tmplist)

;// 遍歷可選路徑

// 注意要從上乙個元素開始遍歷,因為可以重複使用同一元素多次

for(

int i = start; i < candidates.length; i++)if

(tmp2 == target)

backtrack

(candidates, target, i, newlist, tmp2)

;// 不選當前

newlist.

remove

(newlist.

size()

-1);}}}

這個應該是跟target和candidates數字範圍密切相關。

先將陣列從小到大排序

每次貪心地優先組合小數,直到當前的和大於等於目標值

如果相等,就找到乙個組合,放入結果集

否則就按說明還有下標更大的數且目前和大於target,此時就可以按新增當前元素的數量減去當前元素,去新增下乙個元素,只要和小於等於target就可以回溯查詢

class

solution

private

void

backtrack

(int

candidates,

int target,

int start, arraylist

tmplist,

int tmp)

// 2. 如果和等於target,說明找到乙個組合,新增到結果集

if(tmp == target)

// 3. 結束條件

if(start +

1== candidates.length)

// 4. 否則說明還有下標更大的數且目前和大於target

// 此時就可以按新增當前元素的數量減去當前元素

// 回溯的去新增下乙個元素,只要和小於等於target就可以回溯查詢

while

(times >0)}}}

組合總和 回溯演算法

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

演算法 回溯 組合總和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 這段 組合總和...

組合總和(回溯)

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