Combination Sum II
Problem
https://leetcode.com/problems/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:
Input: candidates = [10,1,2,7,6,1,5], target = 8
Output:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
Example 2:
Input: candidates = [2,5,2,1,2], target = 5
Output:
[
[1,2,2],
[5]
]
Constraints:
1 <= candidates.length <= 1001 <= candidates[i] <= 501 <= target <= 30
Pattern
Array, Backtracking
Approaches
Code
def combinationSum2(candidates: list[int], target: int) -> list[list[int]]:
result = []
candidates = sorted(candidates)
def combination_sum(combination, i):
s = sum(combination)
if s == target:
result.append(combination.copy())
return
if s > target:
return
if i >= len(candidates):
return
for j in range(i, len(candidates)):
if s + candidates[j] > target:
break
if j > i and candidates[j] == candidates[j - 1]:
continue
combination_sum(combination + [candidates[j]], j + 1)
combination_sum([], 0)
return result
Test
>>> from combination_sum_ii__backtracking import combinationSum2
>>> sorted([sorted(c) for c in combinationSum2([10, 1, 2, 7, 6, 1, 5], 8)])
[[1, 1, 6], [1, 2, 5], [1, 7], [2, 6]]
>>> sorted([sorted(c) for c in combinationSum2([2, 5, 2, 1, 2], 5)])
[[1, 2, 2], [5]]
- combination_sum_ii__backtracking.combinationSum2(candidates: list[int], target: int) list[list[int]]