1. 回溯搜索,是一种搜索的方式
2. 本质是穷举,主要解决以下几种问题:
2.1 组合问题,N个数中按一定规则找出k个数的集合
2.2 切割问题, 字符串按一定规则有多少切割方式
2.3 子集问题, N个数的集合中有多少符合条件的子集
2.4 排列问题, N个数按一定规则全排列,有多少种方式
2.5 棋盘问题: N皇后,解数独
几个重要的点:结束条件;做选择;剪枝操作
77. 组合问题
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
result = []
subset = []
def backtrack(subset, n, k, start_i):
if len(subset) == k:
result.append(subset.copy())
return
for i in range(start_i, n + 1):
subset.append(i)
backtrack(subset, n, k, i + 1)
subset.pop()
backtrack(subset, n, k, 1)
return result
结束条件:当收集到的subset长度等于k,就将subset.copy()加入result中,不能直接result.append(subset) ,这会导致subset改变会影响到result
做选择: 每次把遍历到的值加入subset
剪枝操作:每次循环内部递归的时候,可以从当前值的下一个开始循环。避免重复