40. Combination Sum II
class Solution { public List<List<Integer>> combinationSum2(int[] candidates, int target) { List<List<Integer>> ret=new ArrayList<List<Integer>>(); Arrays.sort(candidates); boolean[] used=new boolean[candidates.length]; generateCombination(new ArrayList<Integer>(), 0, target, used, ret, candidates); return ret; } private void generateCombination(List<Integer> list, int idx, int target, boolean[] used, List<List<Integer>> combs, int[] candidates){ if(target==0) { combs.add(new ArrayList<Integer>(list)); return; } if(idx>=candidates.length||target<0) return; generateCombination(list, idx+1, target, used, combs, candidates); if(idx>0&&used[idx-1]==false&&candidates[idx-1]==candidates[idx]) return; list.add(candidates[idx]); used[idx]=true; generateCombination(list, idx+1, target-candidates[idx], used, combs, candidates); list.remove(list.size()-1); used[idx]=false; } }
class Solution { public List<List<Integer>> combinationSum2(int[] candidates, int target) { List<List<Integer>> combs=new ArrayList<List<Integer>>(); Arrays.sort(candidates); generateCombination(new ArrayList<Integer>(), 0, target, combs, candidates); return combs; } private void generateCombination(List<Integer> list, int idx, int target, List<List<Integer>> combs, int[] candidates){ if(target==0) { combs.add(new ArrayList<Integer>(list)); return; } if(idx>=candidates.length||target<0) return; for(int i=idx;i<candidates.length;i++) { if(i>idx&&candidates[i]==candidates[i-1]) continue; list.add(candidates[i]); generateCombination(list, i+1, target-candidates[i], combs, candidates); list.remove(list.size()-1); } } }