class Solution:
def combinationSum2(self, candidates: List[int], target: int):
res = []
def tranceback(index, path, remain):
for i in range(index,len(candidates)):
tranceback(0, [], target)
return res
回溯函数接受三个参数,第一个就是指针,第二个是组合,第三个是目前的组合距离目标还有多远。
函数内的循环是从指针的位置开始的,避免了重复检查内容。
循环每走一次,我们就看看是否满足了要求。
for i in range(index, len(candidates)):
candi = candidates[i]
# 达到目标,不用再循环了
if candi == remain:
res.append(path + [candi])
return
#还不够,继续
if candi < remain:
# 往下阅读
如果不够,我们可以继续从指针循环:
for i in range(index, len(candidates)):
candi = candidates[i]
# 达到目标,不用再循环了
if candi == remain:
res.append(path + [candi])
return
#还不够,继续
if candi < remain:
for i in range(i + 1, len(candidates)):
remain -= candi
# 重复上面的操作
# state是一个一维数组,记录每一行的皇后横坐标。例如[1, 4, 6, 3, 0, 7, 5, 2]
def queens(num=8,state=()):
for pos in range(num):
# 剪枝:如果冲突了就不循环了,相当于上面的return
if not conflict(state, pos):
# 到了倒数第二行,就不必嵌套了,返回所有可能的坐标即可(不符合的x位置已经被过滤掉了)
if len(state)==num-1:
yield(pos,)
else:
# 以当前状态为起点,再次调用函数自身。
for result in queens(num, state+(pos,)):
yield (pos,)+result