← 返回算法与AI总览 算法与AI · 知识点深化 · 回溯算法:排列、组合、子集、N 皇后的通用模板
算法与AI · 知识点深化 · 算法思想

回溯算法:排列、组合、子集、N 皇后的通用模板

回溯就是试错+撤销:一条路走到底,走不通退回来换一条。排列、组合、子集、N 皇后全是一个模板:递归向下→选择→递归→撤销选择。这一页把模板背熟,一类题通杀。

① 怎么学(4 步走,约 70 分钟)

先建立直觉再抠细节,按这四步走最稳:

1看图建立直觉(10 分钟)
读②③:先在脑子里画出本课核心结构图。
2记完整体系(15 分钟)
读④:把对比表和公式看懂,不要急着背。
3跟例题走一遍(20 分钟)
精读⑤:看三个例题怎么用知识点解题。
4刷题纠错(剩余时间)
做⑦⑩,错题回⑥诊断。
本课小目标学完你要能:① 写出回溯通用模板;② 区分排列/组合/子集;③ 去重;④ N 皇后思路。

② 一图看懂:回溯全景

回溯 路径 path 当前选择 选择列表 还能选什么 结束条件 收集结果 剪枝 跳过无效分支 应用:排列组合/棋盘 DFS 暴力枚举 易错:忘了撤销选择 递归后 pop
读法:中心是本课主题,四条分支展开核心维度,下方是典型应用与高频易错点。

③ 本质直觉:回溯就是"走迷宫试错"

走迷宫:每条路走到头,死路退回来换一条。回溯一模一样:

模板三步:1. 做出选择(加入 path);2. 递归往下;3. 撤销选择(pop)。

组合 vs 排列:组合不看顺序(1,2 和 2,1 一样),用 start 控制从哪开始选;排列看顺序,用 used 数组标记用过的。

剪枝:排序后跳过重复数字,避免重复解。

根 选1 选2 选3 选 -> 递归 -> 撤销(回溯)
时间复杂度排列 O(n!),组合 O(2^n)。别拿回溯解大数组题,那是 DP。

④ 完整知识体系

排列/组合/子集对比

类型顺序start/used
子集不看顺序start排序后跳重复
组合不看顺序start同上
排列看顺序used 数组排序后跳重复
N皇后棋盘逐行放列/对角线剪枝
通用模板dfs(start){ 收集; for(i=start..n){ 选择; dfs(i+1); 撤销 } }
去重if(i>start && nums[i]==nums[i-1]) continue;

为什么组合用 start

组合 [1,2] 和 [2,1] 重复。传 start 保证只往后选,不会回头。排列用 used 数组,每次从 0 开始但跳过用过的。

⑤ 应用场景与例题

例1 子集 [1,2,3]
每个元素选或不选,递归树 2^3=8 个。start 控制。
例2 全排列 [1,2,3]
used 标记。第一层选 1/2/3,剩下递归。共 6 个。
例3 组合总和 candidates=[2,3,5], target=8
可重复选同元素,dfs 传 i 而不是 i+1。剪枝:排序后超过 target break。
做题心法模板背熟:选择→递归→撤销,区别只在 start/used/剪枝。

⑥ 高频错误诊断(4 条)

错误1:递归后忘记 poppath 带着脏数据进入下一分支。
错误2:组合题用 used 不用 start产生重复排列。
错误3:去重条件写 i>0应该 i>start,同层跳过。
错误4:把回溯当 DP回溯是穷举,大数组会超时。

⑦ 考点真题演练(5 题)

考点分布

考法出题形式应对
模板问核心三步选择-递归-撤销
组合问用 start 还是 usedstart
排列问用什么used 数组
去重问条件同层跳重复

真题basic1. 回溯算法的核心三步是?

真题mid2. 组合问题用什么避免重复?

真题mid3. 排列问题用什么标记用过的元素?

真题hard4. 子集 [1,2,2] 去重,正确剪枝?

真题hard5. 回溯时间复杂度?

⑧ 必背知识点卡

模板:选->递归->撤销
组合:start 只往后
排列:used 标记
去重:i>start && 相等跳过
子集:每步收集当前 path
N皇后:逐行放,列/对角线剪枝
复杂:O(2^n) 别解大数组

⑨ 动手输出:写组合总和回溯

场景:candidates 找和为 target 的组合,可重复选。
① 排序:先排序方便剪枝。
② 递归:从 start 开始选。
③ 选择:加入 path,剩余 target-=cand。
④ 递归:传 i(可重复选当前)。
⑤ 撤销:pop,target 恢复。
口述思路组合可重复传 i,不可重复传 i+1。

⑩ 分层练习(基础 + 中档 + 拔高)

▍基础 6 题

基础1回溯核心三步?
选择、递归、撤销。
基础2组合用什么参数?
start。
基础3排列用什么?
used 数组。
基础4去重条件?
i>start 且相等跳过。
基础5子集每步做什么?
收集当前 path。
基础6回溯时间复杂度?
O(2^n)/O(n!)。

▍中档 5 题

中档1为什么组合用 start?
避免 [1,2] [2,1] 重复。
中档2全排列为什么用 used?
排列看顺序,每元素用一次。
中档3为什么要排序?
去重剪枝需要相邻比较。
中档4N皇后怎么剪枝?
列和两条对角线不能有皇后。
中档5可重复选传 i 还是 i+1?
可重复传 i。

▍拔高 5 题

拔高1分割回文串怎么回溯?
枚举切割点,判断是否回文。
拔高2括号生成怎么回溯?
左右括号数限制。
拔高3数独怎么解?
逐格尝试 1-9,校验行/列/宫。
拔高4子集 II 去重?
排序后同层跳重复。
拔高5组合总和 II 每个数用一次?
传 i+1。

⑪ 记忆口诀 + 7 天复习计划

三句口诀① 选择递归再撤销,模板背熟一类题。② 组合 start 排列 used,去重同层跳相等。③ N皇后逐行剪枝,指数复杂度别硬跑。
天任务自检
第 1 天读②③,背通用模板三步写对
第 2 天背组合排列对比 + 基础 6 题区别记住
第 3 天做中档 5 题,写全排列代码能跑
第 4 天做拔高 5 题,写 N皇后剪枝对
第 5 天做⑦真题 5 题限时每题 5 分钟
第 6-7 天合书白板写模板不看资料

← 返回算法与AI总览