LeetCode 39 組合總和

2021-10-06 07:29:43 字數 1840 閱讀 1574

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

所有數字(包括 target)都是正整數。解集不能包含重複的組合。

輸入: 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]]輸入: candidates =[2

,3], target =5,

所求解集為:[[

2,3]

]

要求得出所有和為目標值的組合,那麼這樣使用回溯法將所有結果遍歷一邊是非常合適的。

陣列中所有元素都是可以重複使用的,那麼也就是說每次都可以從第一位開始,但是最終結果中不允許包括重複的組合,那麼應該怎樣解決呢,那就要將每組資料的第乙個值的索引傳遞進去,每一次都是從這個位置開始判斷,那麼就可以避免將之前的元素重複使用了。

回溯法(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。

最難的地方應該是回溯點的確定和遞迴的使用

/**

* @description:給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。

* @author: cuiyang

* @date: 2020/5/19 10:53

*/// 39. 組合總和

// // 時間複雜度:o(n)

// 空間複雜度:o(n)

public

class

solution

return result;

}/**

* 給定陣列,目標值,和,單個結果集,計算開始位置

** @param candidates

* @param target

* @param val

* @param r

* @param j

*/private

static

void

dfs(

int[

] candidates,

int target,

int val, list

r,int j)

//回溯點

此處將一小部分的步驟寫出,初次寫演算法類文章,多多指教。

LeetCode 39 組合總和

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

leetcode39 組合總和

參考 class solution if next num.size target num next 0 邊界條件 return 對於每個元素,有兩種處理方式,選當前元素或者不選當前元素 psol.push back num next 選當前元素 search num,next,psol,targe...

LeetCode39組合總和

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