回溯¶
简介¶
回溯是一种通用的算法技术,通过递归尝试逐步构建解决方案来解决问题,在任何时候移除不满足约束条件的解决方案(即回溯)。它特别适用于组合问题,如排列、组合和子集。
典型应用¶
- 排列和组合
- 子集和幂集
- N 皇后问题
- 数独求解器
- 单词搜索
- 图着色
- 迷宫寻路
- 分割问题
经典问题¶
回溯解题模板¶
关键要点与陷阱¶
- 递归调用后始终要回溯(撤销最后的选择)
- 如果违反约束条件,尽早剪枝(提高效率)
- 排列问题使用 visited/used 数组
- 组合/子集问题使用起始索引避免重复
- 注意 Go 中的引用类型(slice、map);必要时进行复制
参考资料¶
回溯模板¶
多叉树遍历框架:
核心三题¶
掌握三道核心题,理解所有回溯问题:
- 组合 (Combination): LeetCode 77. 组合
- 排列 (Permutation): LeetCode 46. 全排列
- 子集 (Subset): LeetCode 78. 子集
这三类问题的本质都是 遍历多叉树:
- 构建决策树:每个节点代表一个选择,从根节点到叶子节点的路径就是一个解
- 遍历求解:用回溯框架遍历这棵多叉树,收集所有路径
- 关键差异:三者在"做选择"和"撤销选择"的细节上略有不同
理解这些差异,你就掌握了回溯算法 80% 的精髓。
示例:[1,2,3] 的全排列决策树
其他经典问题¶
汉诺塔、N 皇后、图着色、旅行商问题