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],

]

Solution in python:

class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
result = []
candidates.sort()

def backtrack(arr, sol):
if sum(sol) > target:
return
if sum(sol) == target:
result.append(sol)
return
# note that arr changes each time
for i in range(len(arr)):
# filter the duplicates
if i > 0 and arr[i] == arr[i-1]:
continue
backtrack(arr[i+1:], sol+[arr[i]])

backtrack(candidates, [])
return result

Complexity analysis:

• Time complexity: O(2^n)