Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.
Each number in candidates may only be used once in the combination.
**Note:**All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
- Example 1:
Input: candidates = [10,1,2,7,6,1,5], target = 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
] - Example 2:
Input: candidates = [2,5,2,1,2], target = 5,
A solution set is:
[
[1,2,2],
[5]
]
解法
这道题和上一道题Combination Sum差不多,只是不可以重复使用同一个,因此在之前的代码基础上修改一下即可
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
List<List<Integer>> res=new ArrayList<List<Integer>>();
combinationSumDFS(res,target,candidates,0,new ArrayList<Integer>());
return res;
}
private void combinationSumDFS(List<List<Integer>> res, int target, int[] candidates,int start, List<Integer> list) {
// TODO Auto-generated method stub
if(target<0 )
return ;
if(target==0){
res.add(new ArrayList<Integer>(list));
return ;
}
for(int i=start;i<candidates.length;i++)
{
if (i > start && candidates[i] == candidates[i - 1])
continue;
list.add(candidates[i]);
combinationSumDFS(res,target-candidates[i], candidates,i+1, list);
list.remove(list.size()-1);
}
}
Runtime: 8 ms, faster than 93.83% of Java online submissions for Combination Sum II.
Memory Usage: 39.6 MB, less than 49.67% of Java online submissions for Combination Sum II.