https://leetcode.com/problems/combination-sum/description/
1、得到总的Sum是一个累加的过程。需要使用元素逐一的叠加起来,因此递归的每一步就是再加一个元素的过程。
2、对于求和类的题目,使用target 逐一的减,是一个常见的方法。如Two Sum,以及一系列二叉树中求和路径的题目、
对于此题,主函数为:
def combinationSum(candidates, target):
主要考虑递归函数的参数。考虑题目要求,应至少包含 candidates,target,返回值,path四个。再考虑到累加时是在数组中逐一考虑的,从后面往前加的时候,将已经包含后面的元素了,因此需要一个位置,指代只用从哪个位置之后的元素。因此再加一个index的信息,所以得到:
dfs(candidates, target, index, path, res)
其中res作为全局变量,要在combination里声明。
考虑到递归时是逐一相减的,因此,终止条件是结果小于0时,返回,等于0时输出res。因此:
if target < 0: return if target == 0: res.append(path)
对于递归的过程,每加一个元素,将在target中扣除这个元素,同时在path中记录这次的信息。所以
dfs(candidates, target - candidates[i], i,path + [candidates[i]], res)
PS:对于list,可以通过这种方式加入元素——
x = [4] x = x + [3] print(x) #x=[4,3]
结合以上几点,即可得出最后的代码。
candidates = [2, 3, 6, 7] target = 7 def dfs(candidates, target, index,path, res): if target < 0: return if target == 0: res.append(path) for i in range(index, len(candidates)): dfs(candidates, target - candidates[i], i,path + [candidates[i]], res) def combinationSum(candidates, target): res =[] dfs(candidates, target, 0, [], res) return res print(combinationSum(candidates,target))