1. 程式人生 > 實用技巧 >39. 組合總和-dfs回溯-中等難度

39. 組合總和-dfs回溯-中等難度

問題描述

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

1 <= candidates[i] <= 200
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, int
target) { 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(); } } } }