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