说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
很显然需要用回溯的思想来解题,记录一个临时list保存某个组合,记录一个num保证组合不会重复:
class Solution:
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
if not candidates:
return []
candidates.sort() # 先排序
res = []
self.helper(target, candidates, res, [], 0) # []记录一个临时list,0记录位置保证不重复
return res
def helper(self, target, candidates, res, one, num):
if target == 0: # target为0说明刚好组合
res.append(one)
return
if target < candidates[0]: # 不可能有组合
return
for i in range(num, len(candidates)):
if candidates[i] > target:
break
tmp = [i for i in one] # 注意这里要copy
tmp.append(candidates[i])
self.helper(target-candidates[i], candidates, res, tmp, i)