39. 组合总和
class Solution(object):
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
def dfs(candidates, begin, end, path, res, target):
if target == 0:
res.append(path)
return
for i in range(begin, end):
if target - candidates[i] < 0:
break
dfs(candidates, i, end, path + [candidates[i]], res, target - candidates[i])
n = len(candidates)
if n == 0:
return []
candidates.sort()
path = []
res = []
dfs(candidates, 0, n, path, res, target)
return res
思路:
深搜,时间复杂度O(S),S为所有可行解的长度之和,即所有叶子结点的深度之和。空间复杂度为O(target),为递归的栈深度。
注意点:
剪枝可以加快速度,排序后的数组如果当前值大于需要的target,那么后面的数更大于target。第一次执行dfs那句begin的位置写成了begin而不是i,这会出现重复结果。