1
题目描述
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使和为 target 的组合。candidates 中的数字可以无限制重复被选取。
2
回溯算法
回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试,是一种类似枚举的搜索方式。比如现在要从A走到B,当从A->B->D时发现没有办法走到B,则要退回C,从C->E,再从E->B。
3
题解
本题结合回溯算法的思想,我们首先遍历一个点a,然后计算能否从剩余的点中找到和为target-a的点。结合上述例子看一下计算过程:
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
if not candidates:
return []
#建立递归函数,进行回溯遍历
def back(target,index,tmp):
#两个结束遍历条件
if target == 0:
path.append(tmp[::])
return
if target < 0:
return
#从当前的index后面加入点,避免重复
for i in range(index,len(candidates)):
tmp.append(candidates[i])
target -= candidates[i]
back(target,i,tmp)
#把当前层前一个点剔除,好在下一次循环中加入下一个点
tmp.pop()
target += candidates[i]
tmp = []
path = []
back(target,0,tmp)
return path