回溯算法
本质:递归函数
纯暴力 针对for循环暴力也无法解决的问题
- 组合问题 数组中符合条件的组合结果 【强调无序】
- 切割问题 给定str,切割子串
- 子集问题
- 排列问题 【强调元素顺序】
- 棋盘问题 n皇后
抽象为树形结构
宽度:for实现
深度:递归
# 模板
def recursion(*args):
if (end condition):
store in res
return
# search by layer
for :
node operation
recursion()
recursion operation # back upper layer
return
77. 组合
理解回溯的模板
因为是组合问题,函数参数需要定义起始位置,保证res中的集合不重复
def combine(self, n: int, k: int) -> List[List[int]]:
path = []
res = []
def recursion(n, j, k):
if len(path) == k:
res.append(path[:])
return
for i in range(j, n):
path.append(i)
recursion(n, i+1, k)
path.pop()
recursion(n+1, 1, k)
return res