回溯法解Leetcode之Combination Sum心得

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))

猜你喜欢

转载自blog.csdn.net/leokingszx/article/details/79476015