leetcode/notes/src/backtrack.md

29 lines
1.5 KiB
Markdown
Raw Normal View History

2023-02-01 10:09:19 +00:00
# 总结
使用场景:
- 如果解决一个问题需要多个步骤,而每个步骤有多个可能的结果,题目又要求我们找出所有可能的结果,那么这个时候可以考虑回溯法。
- 回溯法本质是在一棵树上进行深度优先遍历
算法设计:
关键就是要学会分析和画图,然后确定传入参数。只要传入参数确定了代码框架就确定了 (返回值一般是 `void`)
- 得有一个 `&result` 来存放结果
- 每一层的节点所包含的数据是什么,需要一系列的参数来描述当前节点的状态(传入的参数实际上是上一轮迭代的数据)。
- 终止条件是什么?回溯法中的每个节点并不是真的树状节点,没有 `nullptr` ,因此用空指针来判断是否到了叶子结点并不合理,需要其它的一些方法来确定是否到达叶子节点,比如高度。
- 每次迭代要在上一次迭代的基础上进行哪些操作?需要哪些参数才能完成这些操作?
复杂度分析:
- 时间复杂度:最长路径长度 × 搜索树的节点数
- 空间复杂度:一个节点所需要的空间 × 搜索树的节点数
分类:
- 组合问题N 个数里面按一定规则找出 k 个数的集合
- 切割问题:一个字符串按一定规则有几种切割方式
- 子集问题:一个 N 个数的集合里有多少符合条件的子集
- 排列问题N 个数按一定规则全排列,有几种排列方式
- 棋盘问题N 皇后,解数独等等