主要内容
回溯模板
题目
77. 组合
思路分析
回溯的模板
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
代码
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
res = []
path = []
def backtracking(n, k, startindex):
# 终止条件
if len(path) == k:
res.append(path[:])
return
# 剪枝
# 已有的个数 len(path),还需的个数 k - len(path)
# 最大的起始 n + 1 - (k - len(path))
for num in range(startindex, n + 1 - (k - len(path)) + 1):
path.append(num)
backtracking(n, k, num + 1)
path.pop()
backtracking(n, k, 1)
return res