https://leetcode.cn/problems/combination-sum-ii/
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
# 星级:☆☆☆
# 标签:回溯
# 回溯法三步走
# 1、递归函数的返回值以及参数
# 2、确定终止条件
# 3、单层递归(搜索)逻辑
# 元素重复不可复选(排序+剪枝)
from copy import deepcopy
path, result, n = [], [], len(candidates) # 子集组合排列回溯三剑客
candidates.sort() # sort的目的是让相同数字排在一起,好去重
def backtrack(start):
if sum(path) == target:
result.append(deepcopy(path)) # 或者 result.append(path[:])
return
if sum(path) > target:
return
for i in range(start, n):
if i > start and candidates[i] == candidates[i - 1]:
continue
path.append(candidates[i]) # 做选择
backtrack(i + 1) # 进入下一层回溯
path.pop() # 取消选择
backtrack(0)
return result