組合總和 I(力扣第39題)

2022-06-16 11:36:10 字數 1444 閱讀 2937

題目:

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

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

說明:

所有數字(包括 target)都是正整數。

解集不能包含重複的組合。 

示例:

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

,所求解集為:

[ [7],

[2,2,3

]]

分析:給定的陣列中的元素是不重複的,但是陣列中的元素在同一條搜尋路徑中是可以無限制選取的,只要能夠湊成target這個目標數。這也就意味著,當我們在搜尋的時候,從當前的點往下進行搜尋的時候,可以選擇的範圍是陣列中所有的元素。下面我們通過乙個具體的例子分析搜尋結果的整個過程,陣列[2,3,5],target=8,其結果搜尋過程如下圖:

在上面的圖中,從根節點到紅色葉子結點的路徑是能夠湊成最終結果的路徑,對應分支上的值就是組合成target的元素值,但是我們發現這些路徑中的元素組合存在重複的情況,這是我們不想看到的,所以需要進行去重處理,那麼應該怎麼去重呢?先統計一下這些路徑:

2-2-2-2

2-3-3

3-2-3

3-3-2

3-55-3

我們發現第二組合和第三個組合是重複的,重複的原因在於這些元素在搜尋路徑中的順序不一樣,所以就產生了一條新的路徑,也能湊成target,那麼應該怎麼辦呢?很簡單,就讓搜尋路徑中,位於前面的分支的值要小於等於後面分支的值,這就能夠將重複的組合去掉,從圖中觀察也正是這樣的規律:重複的組合產生的原因就是,由於每次搜尋的可選範圍都是陣列中的所有元素,所以就出現了前面分支中的元素值大於後面元素值的情況,這就可能會造成重複。我們可以以上一次搜尋的元素值作為下一次搜尋的遍歷起始值,來達到這樣的效果。同時要時刻判斷當前搜尋元素值是否大於target,如果大於直接跳過,節省時間。

**實現:

private list>reslist;

public list> combinationsum(int candidates, int

target)

private

void findcombinationbydfs(int candidates, int target, listcurres,int

start)

for (int i = start; i < candidates.length; i++) }}

力扣39 組合總和

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。有時候剪枝不止需要加上附加條件,還需要對原有資料集進行改動,比如排序。class solution ...

ii 組合總和 組合總和 II(力扣第40題)

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

LeetCode第39題 組合總和

題目描述 給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。解題思路 1 關鍵點在於,如何判斷數字和為 target,設定變數remain來記錄是否為...