回溯理论基础
回溯三步骤:
-
回溯函数模板返回值以及参数
- 再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。
-
回溯函数终止条件
- 什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。
-
回溯搜索的遍历过程
77. 组合
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
解题思路:
如图所示,本体思路为在n个书中选一个,有n种可能,在剩下数中选一个,依次递归。回溯逻辑与递归三步骤类似
输入参数:def backtracking(n, k, start_number, path, result), start_number记录每次递归的可选择起始点,path记录本次的存储,result总存储
停止条件:当path已经包含k个数,加入result
回溯逻辑:每次选择一个数后,下一个数从后一个开始选,记得回溯
for i in range(start_number, n+1)
+path.append(i)
+backtracking(n,k,start_number+1, path, result) + path.pop()
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
result= []
path = []
def backtracking(n, k, start_index, path, result):
#stoping
if len(path) == k:
result.append(path[:])
for i in range(start_index, n+1):
path.append(i)#select the next from the rest
backtracking(n, k, i+1, path, result)
path.pop()
backtracking(n, k, 1, path, result)
return result