回溯:解决排列组合问题
回溯 == 遍历+剪枝, 所有的回溯法都是树形结构
回溯伪代码:
if 到底or终止条件:
存结果
return
for 层序遍历
处理cur
递归处理
撤销处理cur #回溯
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
res=[]
self.huisu(n,k,1,[],res)
return res
def huisu(self,n,k,start,path,res):
if len(path)==k:
res.append(path[:]) #直接用path是个指针 path最后会被清空的 用[:]是取值复制版
return
for i in range(start,n+1):
path.append(i)
self.huisu(n,k,i+1,path,res)
path.pop()
回溯可以剪枝,剪枝:起始范围
i是那个最早的父亲节点(孩子是start==i+1) 如果i比较靠后,一直找到叶子结点这条path都无效
至晚要从该起始位置 : n - (k - path.size()) + 1,开始遍历
这个能取到 range左闭右开 所以到n - (k - path.size()) + 2为止
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
res=[]
self.huisu(n,k,1,[],res)
return res
def huisu(self,n,k,start,path,res):
if len(path)==k:
res.append(path[:]) #直接用path是个指针 path最后会被清空的 用[:]是取值复制版
return
for i in range(start,n-(k-len(path))+2):
path.append(i)
self.huisu(n,k,i+1,path,res)
path.pop()