39. 組合總和-dfs回溯-中等難度
阿新 • • 發佈:2020-07-19
問題描述
給定一個無重複元素的陣列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]
]
提示:
1 <= candidates.length <= 30
candidate 中的每個元素都是獨一無二的。
1 <= target <= 500
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/combination-sum
解答
class Solution { List<List<Integer>> res=new ArrayList<>(); public List<List<Integer>> combinationSum(int[] candidates, inttarget) { if (candidates==null)return res; dfs(target,0,new Stack<Integer>(),candidates); return res; } //深度遍歷 private void dfs(int target, int index, Stack<Integer> pre, int[] candidates) { //等於零說明結果符合要求 if (target==0){ res.add(new ArrayList<>(pre)); return; } //遍歷,index為本分支上一節點的減數的下標 for (int i=index;i<candidates.length;i++){ //如果減數大於目標值,則差為負數,不符合結果 if (candidates[i]<=target){ pre.push(candidates[i]); //目標值減去元素值 dfs(target-candidates[i],i,pre, candidates); //每次回溯將最後一次加入的元素刪除 pre.pop(); } } } }