Question
Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
给出一个候选数字集合C(没有重复数字)和一个目标值T,请你找出所有用C中元素相加得到T的组合。(相同的数字可以多次使用)
Example
given candidate set [2, 3, 6, 7] and target 7
A solution set is:
[
[7],
[2, 2, 3]
]
Solution
回溯解。因为同一个数字可以重复使用,所以每次递归仍然从当前元素开始向后遍历,仅当有限个元素相加得到的结果刚好为T时保存该组合到结果集。
public class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> res = new ArrayList<>(); backtracking(candidates, 0, target, res, new ArrayList<>()); return res; } public void backtracking(int[] candidates, int start, int target, List<List<Integer>> res, List<Integer> temp){ if(target < 0) return; // 如果数字能够组合得到T,那么就将这个组合添加到结果集 if(target == 0){ res.add(new ArrayList<>(temp)); return; } for(int i = start; i< candidates.length; i++){ if(candidates[i] <= target){ temp.add(candidates[i]); // 因为数字可以重复,所以每次递归仍然从当前元素向后遍历 backtracking(candidates, i,target - candidates[i], res, temp); temp.remove(temp.size() - 1); } } } }