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