40 组合总和2
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]
主要是先对列表进行排序,然后如果遇到相邻两个相同元素的时候,需要考虑去重,跳过相同的元素。
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
res = []
path = []
def backtrack(candidates, target, sum_now, startIndex):
if sum_now > target:return
if sum_now == target:
res.append(path[:])
return
for i in range(startIndex, len(candidates)):
if i > startIndex and candidates[i] == candidates[i-1]:#去重
continue
path.append(candidates[i])
sum_now += candidates[i]
backtrack(candidates, target, sum_now, i+1)
sum_now -= candidates[i]
path.pop()
backtrack(candidates, target, 0, 0)
return res