题目描述(难度:Medium)
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C 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.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
Tags: Array, Backtracking
Similar Problems: (M) Combination Sum
分析:每个数字只能被使用1次。从示例[10, 1, 2, 7, 6, 1, 5]可以看出,candidates内有重复数字,但每个数字在一次组合里只能各被使用1次
代码实现:
class Solution(object):
def combinationSum2(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
result = []
n = len(candidates)
candidates.sort()#有助于剪枝,且防止结果集中出现重复
def dfs(start, tmpRes, target):
if target == 0:
result.append(tmpRes[:])
return
for i in range(start, n):
#选择起点
if i>start and candidates[i]==candidates[i-1]:#防止结果集中出现重复
continue
if target-candidates[i]<0:#尽早剪枝
break
tmpRes.append(candidates[i])
dfs(i+1, tmpRes, target-candidates[i])
tmpRes.pop()#递归还原
dfs(0, [], target)
return result