Combination Sum II

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的区别:

  1. array要sort,因为后面要去重

  2. 不能用重复的数字,所以递归调用bactracking是i要加1

class Solution {
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        List<List<Integer>> list = new ArrayList<>();
        
        Arrays.sort(candidates);
        backTracking(list, new ArrayList<>(),candidates,target,0);
        
        return list;
    }
    
    public void backTracking(List<List<Integer>> list, List<Integer> tmpList, int[] condidates, int remain, int start){
        if(remain < 0)
            return;
        if(remain == 0)
            list.add(new ArrayList<>(tmpList));
        
        else{
            for(int i = start ; i< condidates.length;i++){
                if(i > start && condidates[i] == condidates[i-1]) continue;
                
                tmpList.add(condidates[i]);
                backTracking(list,tmpList,condidates,remain - condidates[i],i+1);
                
                tmpList.remove(tmpList.size()-1);
            }
        }
        
    }
    
}

Last updated