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]
]
解法:递归,DFS思想解决。
class Solution {
List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
List<Integer> tmp = new ArrayList<Integer>();
findAns(res,candidates,target,0,tmp,0);
return res;
}
public void findAns(List<List<Integer>> res, int[] candidates, int target, int sum, List<Integer> tmp,int index){
if(sum > target){
return;
}else if(sum == target){
List<Integer> oneComb = new LinkedList<Integer>(tmp); //为什么要新建一个?
res.add(oneComb);
}else{
for(int i=index;i<candidates.length;i++){
if(candidates[i]>target)break; //适当剪枝
tmp.add(candidates[i]);
findAns(res,candidates,target,sum + candidates[i],tmp,i);
tmp.remove(tmp.size()-1);
}
}
}
}