class Solution(object):
def combinationSum2(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
# 回溯法
# 此题与39题的区别:39的数组内无重复,但是组合内数字可以重复;40是数组内有重复,但是组合内的数字只能使用一次,解集中不能有重复的集合
# 40题最关键的一点就是去重,这里的去重是解集中的,不是解集内部
# 例如,[1,1,1,2]可以,[[1,2],[1,2]]不行
result = list()
# 先排序,从小到大,让重复的可以挨着
candidates.sort()
self.backtracking(candidates, target, result, 0, [])
return result
def backtracking(self, candidates, target, result, start, path):
# 终止条件
if sum(path) == target:
result.append(path[:])
return
for i in range(len(candidates)):
# 剪枝
if sum(path) + candidates[i] > target:
return
# 去重操作,candidates[i] == candidates[i-1]只能保证当前数字与前一个数字相等,i>start确保的是,同一层不能有重复的,但是同一枝里面,往下是可以重复的
if i>start and candidates[i] == candidates[i-1]:
continue
path.append(i)
self.backtracking(candidates, target, result, i+1, path)
# 回溯
path.pop()
回溯算法--LC.40组合总和II
最新推荐文章于 2024-07-25 19:34:38 发布