回溯起始篇 力扣39T組合總和

2021-10-04 20:37:56 字數 1199 閱讀 9053

題目

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

]思路

遇到每一道題都往會的上先靠,是不是有點像動態規劃湊錢那道題。是的,動態規劃是可以做的。但是我們用回溯來做一下。其實回溯和dfs有點像,具體我們下一章再說,先從這道題開始。

很簡單的思路,我先用2填滿,可以的話就輸出,大了的話就回溯到上乙個2,用下乙個數填,大了的話還是回溯到上乙個,試下乙個,都試完不行。就再往回退到上上個2,繼續上面的步驟。

這就是回溯的基本思路,此路不通就回到路口選擇另乙個岔路。可以看出,回溯是需要記錄走過的路的,所以我們需要輔助陣列儲存之前走過的路。

這裡面有乙個剪枝的思想,具體下一章再說。回溯不會走所有的路,因為他有條件限制,當某條路不滿足條件時,直接棄掉。

用**來說吧:

class solution 

else

if(target<0)

//超了直接return回溯到上乙個節點

for(

int i=start;i)//從此元素開始,這樣可以保證不重複

} vectorint>>

combinationsum

(vector<

int>

& candidates,

int target)

};

我直接使用dfs標註的這個函式,因為其實也用到了dfs的思想,作為乙個新的思想起始章節,用乙個今晚做的例題來引出。

下一章開始講述回溯演算法,俗稱萬能思想,有興趣可以把此題用動態規劃做一下。參考動態規劃一里的換錢**即可。

晚安,打卡睡覺。

力扣39 組合總和

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

力扣39 組合總和 遞迴 回溯 DFS

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

力扣 中等 39 組合總和

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