LeetCode 40. Combination Sum II
考点 | 难度 |
---|---|
Backtracking | Medium |
题目
Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sum to target.
Each number in candidates may only be used once in the combination.
Note: The solution set must not contain duplicate combinations.
思路
比允许重复的多sort和if statement:
lets take an example 1,2a,2b,2c,4,5,6,7 => 2a,2b,2c all will be considered for combinations when 2a is involved. but when it reaches to 2b(skipping 2a), all possible combinations of 2 are already considered (three 2s is not possible, two 2s and one 2 is already considered) so skipping it for avoiding duplicates.
答案
class Solution(object):
def combinationSum2(self, candidates, target):
ret = []
self.dfs(sorted(candidates), target, 0, [], ret)
return ret
def dfs(self, nums, target, idx, path, ret):
if target <= 0:
if target == 0:
ret.append(path)
return
for i in range(idx, len(nums)):
if i > idx and nums[i] == nums[i-1]:
continue
self.dfs(nums, target-nums[i], i+1, path+[nums[i]], ret)
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> list = new LinkedList<List<Integer>>();
Arrays.sort(candidates);
backtrack(list, new ArrayList<Integer>(), candidates, target, 0);
return list;
}
private void backtrack(List<List<Integer>> list, List<Integer> tempList, int[] cand, int remain, int start) {
if(remain < 0) return; /** no solution */
else if(remain == 0) list.add(new ArrayList<>(tempList));
else{
for (int i = start; i < cand.length; i++) {
if(i > start && cand[i] == cand[i-1]) continue; /** skip duplicates */
tempList.add(cand[i]);
backtrack(list, tempList, cand, remain - cand[i], i+1);
tempList.remove(tempList.size() - 1);
}
}
}