描述
给出一组候选数字 (C) 和目标数字 (T), 找到 C 中所有的组合,使找出的数字和为 T。C 中的数字可以无限制重复被选取。
例如, 给出候选数组 [2,3,6,7] 和目标数字 7,所求的解为:
[7],[2,2,3]
```
###注意事项
```
所有的数字 (包括目标数字) 均为正整数。
元素组合 (a1, a2, … , ak) 必须是非降序 (ie, a1 ≤ a2 ≤ … ≤ ak)。
解集不能包含重复的组合。
```
###代码实现
```
public class Solution {
/**
* @param candidates: A list of integers
* @param target:An integer
* @return: A list of lists of integers
*/
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> results = new ArrayList<>();
if (candidates == null || candidates.length == 0) {
return results;
}
ArrayList<Integer> combination = new ArrayList<>();
Arrays.sort(candidates);
int[] nums = removeduplicate(candidates);
dfs(nums, 0, target, combination, results);
return results;
}
private int[] removeduplicate(int[] nums) {
int index = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != nums[index]) {
nums[++index] = nums[i];
}
}
int[] newnums = new int[index + 1];
for (int j = 0; j < newnums.length; j++) {
newnums[j] = nums[j];
}
return newnums;
}
private void dfs(int[] nums,
int startIndex,
int remainTarget,
ArrayList<Integer> combination,
List<List<Integer>> results) {
if (remainTarget == 0) {
results.add(new ArrayList(combination));
return;
}
for (int i = startIndex; i < nums.length; i++) {
if (remainTarget < nums[i]) {
break;
}
combination.add(nums[i]);
dfs(nums, i, remainTarget - nums[i], combination, results);
combination.remove(combination.size() - 1);
}
}
}
```