Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C 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.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5]
and target 8
,
A solution set is:
[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ] 这一题与之前的问题1来说, 只是不能重复使用数,所以在递归的时候i+1,而且因为有相同的数,为了规避这种情况引发的多个相同的解,要再遇到同样的数的时候跳过。class Solution { public List<List<Integer>> combinationSum2(int[] candidates, int target) { Arrays.sort(candidates); List<List<Integer>> result = new ArrayList(); backtrack(result,new ArrayList<Integer>(),candidates,target,0); return result; } public void backtrack(List<List<Integer>> result,List<Integer> list,int[] candidates,int target,int start){ if(target == 0){ result.add(new ArrayList(list)); } if(target > 0){ for(int i = start;i < candidates.length && target >= candidates[i];i++){ if (i > start && candidates[i] == candidates[i - 1]){//如果是相同的数就可能引发同样的结果,所以将这种情况跳过 continue; } list.add(candidates[i]); backtrack(result,list,candidates,target- candidates[i],i+1); list.remove(list.size()-1); } } } }