Given a set of candidate numbers (candidates
) (without duplicates) and a target number (target
), find all unique combinations in candidates
where the candidate numbers sums to target
.
The same repeated number may be chosen from candidates
unlimited number of times.
Note:
- All numbers (including
target
) will be positive integers. - The solution set must not contain duplicate combinations.
Example 1:
Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
[7],
[2,2,3]
]
Example 2:
Input: candidates = [2,3,5], target = 8,
A solution set is:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
思路:典型的backtracking,可以从左往右走一遍,下一层可以从i开始,因为可以重复利用;
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> lists = new ArrayList<List<Integer>>();
if(candidates == null || candidates.length == 0) {
return lists;
}
Arrays.sort(candidates);
List<Integer> list = new ArrayList<Integer>();
dfs(candidates, lists, list, 0, 0, target);
return lists;
}
private void dfs(int[] candidates, List<List<Integer>> lists,
List<Integer> list, int cursum, int start, int target) {
if(cursum > target) {
return;
}
if(cursum == target) {
lists.add(new ArrayList<Integer>(list));
return;
}
for(int i = start; i < candidates.length; i++) {
list.add(candidates[i]);
dfs(candidates, lists, list, cursum + candidates[i], i, target);
list.remove(list.size() - 1);
}
}
}