40. 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 sum to target
.
Each number in candidates
may only be used once in the combination.
Note: The solution set must not contain duplicate combinations.
Example 1:
Example 2:
Constraints:
1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30
Solution:
The difference with 39, "Each number in candidates
may only be used once in the combination."
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> subResult = new ArrayList<Integer>();
int index = 0;
Arrays.sort(candidates);
helper(candidates, index, target, subResult, result);
return result;
}
private void helper(int[] candidates, int index, int target, List<Integer> subResult, List<List<Integer>> result){
if (target == 0){
result.add(new ArrayList<>(subResult));
return;
}
for (int i = index; i < candidates.length; i++){
if (i > index && candidates[i] == candidates[i-1]){
continue;
}
if (candidates[i] > target){
return;
}
subResult.add(candidates[i]);
helper(candidates, i + 1, target - candidates[i], subResult, result);
subResult.remove(subResult.size() -1);
}
}
}
// TC: O(branch^level) = O(2^n)
// SC: O(level) = O(n)