Page 19 · Decision Tree & Cheat Sheet

19 模式决策树 / 速查表 关键词 → 模式 → 模板口诀

模式 18 个识别信号 108 条模板 34 个直接 打印成一页带走
§1 Decision Tree 决策树

拿到题先问「数据长什么样」

├─ 数组 / 字符串 最常见的入口,先问「要在里面找什么」
│ ├─ 问「见过吗 / 出现几次 / 怎么归类」 → 01 哈希
│ ├─ 已排序,要找一对数、或首尾对称地比 → 02 双指针
│ ├─ 连续区间 + 约束,求最长 / 最短 → 03 滑动窗口
│ ├─ 连续区间 + 和恰好为 K、或多次查询区间和 → 13 前缀和
│ ├─ 要「下一个更大 / 更小」、或定长窗口的最值 → 04 栈与单调栈
│ ├─ 已排序找一个位置、或答案本身可以二分判定 → 05 二分查找
│ ├─ 输入是一堆 [start, end] → 14 区间
│ └─ 每一步该选谁一眼就能看出,且不用回头改 → 15 贪心
├─ 链表 指针改写 + 快慢指针,两件事而已
│ └─ 节点要重新接线,或要找中点 / 判环 → 06 链表
├─ 树 对当前节点做什么 + 递归左右
│ └─ 二叉树 / BST 上的遍历、深度、路径、LCA → 07 树的遍历与递归
├─ 图 / 网格 网格也是图;先问「问的是什么」
│ ├─ 连通块个数 / 面积,或最少步数(边权都是 1) → 10 图的 BFS/DFS
│ ├─ 题面出现「先修 / 依赖 / 循环依赖」(有向) → 11 拓扑排序
│ └─ 边一条条加进来,随时问「这俩在不在一伙」(无向) → 12 并查集
└─ 没有明显结构:问最优值 / 方案数 到这一层就是「枚举还是递推」的选择
  ├─ 要列出全部方案(数据规模很小) → 09 回溯
  ├─ 只关心第 K 个 / 前 K 个,或数据是流式的 → 08 堆 / Top-K
  ├─ 要最优值 / 方案数,状态是一个下标 → 16 一维 DP
  ├─ 状态是两个下标(两个序列、容量 × 物品) → 17 二维 DP 与背包
  └─ 子序列(可跳着取)的最长 / 最多 → 18 子序列 DP

叶子恰好 18 个,与 18 个模式一一对应——构建时程序化核对过覆盖率与唯一性。

§2 Same Word, Different Pattern 同名陷阱

这些词出现时,别急着下结论

这张表由各章 §2 的识别信号跨章聚合而成;每一对都在相关章节的分流条件里写明了怎么分。

§3 Signal Index 关键词索引

全书识别信号,按模式排列

题面出现…去哪一章
「两数之和 / 配对 / 补数」且数组无序01 哈希
「出现次数 / 频率 / 众数 / anagram」01 哈希
「分组 / 归类 / 把同类放一起」01 哈希
「是否存在 / 有没有重复 / 出现过吗」01 哈希
「最长连续序列」但不要求元素相邻01 哈希
题目要求 O(n),而你的暴力解是两层循环在「回头找」01 哈希
「3Sum / 4Sum / 最接近的三数之和」02 双指针
「原地去重 / 移除元素 / 把某类挪到前面」02 双指针
「回文 / 对称 / 首尾比较」02 双指针
「容器 / 面积 / 两根柱子」02 双指针
「已排序数组」+ 找一对 / 三个数满足条件02 双指针
链表「找中点 / 判环 / 倒数第 n 个」02 双指针
「s1 的排列是不是 s2 的子串」「找出所有 anagram 起点」03 滑动窗口
「包含 t 中所有字符的最小子串」03 滑动窗口
「最长 / 最短连续子串 / 子数组」+ 一个约束条件03 滑动窗口
「至多 K 个不同字符 / 至多 K 次替换 / 至多 K 个 0」03 滑动窗口
「长度恰好为 k 的子数组的最大和 / 平均值」03 滑动窗口
你的暴力解是「枚举所有子数组再逐个检查」03 滑动窗口
「下一个更大 / 更小元素」04 栈与单调栈
「柱状图 / 矩形 / 最大面积」04 栈与单调栈
「滑动窗口的最大 / 最小值」04 栈与单调栈
「第一个比它高 / 低 / 便宜的…」04 栈与单调栈
你写出的暴力解,内层循环在「向左/右扫,找第一个满足条件就停」04 栈与单调栈
括号匹配、嵌套、「撤销上一步」04 栈与单调栈
「两个有序数组的中位数 / 第 K 小」05 二分查找
「已排序数组里找目标 / 插入位置 / 第一个大于 X 的」05 二分查找
「旋转有序数组」05 二分查找
「最小的最大值」「最大的最小值」「最少需要多少天 / 多快」05 二分查找
「能否在 X 之内完成」这种问句本身05 二分查找
数据规模到 10⁹ 但答案是个整数05 二分查找
「O(1) 时间的 get 和 put」06 链表
「反转 / 翻转链表(或其中一段)」06 链表
「合并两个有序链表」「删除倒数第 n 个」06 链表
「带随机指针的深拷贝」06 链表
「找中点 / 判断有环 / 环的入口」06 链表
「重排 / 判回文链表」06 链表
「BST」+「第 K 小 / 有序输出」07 树的遍历与递归
「前序 + 中序构造」「序列化 / 反序列化」07 树的遍历与递归
「层 / 每一层 / 最短路径 / 右视图」07 树的遍历与递归
「最近公共祖先 LCA」07 树的遍历与递归
「深度 / 高度 / 直径 / 是否平衡」07 树的遍历与递归
「验证 BST」07 树的遍历与递归
「前 K 个高频 / 最接近原点的 K 个点」08 堆 / Top-K
「动态中位数」08 堆 / Top-K
「合并 K 个有序链表 / 数组」08 堆 / Top-K
「数据流 / 不断插入,随时要回答」08 堆 / Top-K
「每次取出当前最大的,处理完再放回去」08 堆 / Top-K
「第 K 大 / 第 K 小」且数组无序08 堆 / Top-K
n ≤ 20 却要枚举,或明确说「保证答案不超过 X 个」09 回溯
「列出全部方案 / 打印所有路径」09 回溯
「在矩阵里找一个单词 / 一条路径」09 回溯
「所有子集 / 所有组合 / 所有排列」09 回溯
「把字符串切成若干段,每段都要满足…」09 回溯
「棋盘 / 皇后 / 数独」09 回溯
「克隆图 / 深拷贝一张图」10 图的 BFS/DFS
「同时从多个点开始扩散」(腐烂的橘子、着火)10 图的 BFS/DFS
「岛屿 / 连通块 / 区域 / 省份的个数」10 图的 BFS/DFS
「最少步数 / 最短路径 / 最少几轮」(边权都是 1)10 图的 BFS/DFS
「被包围的区域 / 流向两个大洋」10 图的 BFS/DFS
给的是 edges 数组而不是网格10 图的 BFS/DFS
「先修课 / 前置条件 / 依赖关系」11 拓扑排序
「判断有没有循环依赖 / 能不能全部完成」11 拓扑排序
「根据给定的单词序推字母表顺序」11 拓扑排序
「编译顺序 / 任务调度顺序 / 打包顺序」11 拓扑排序
「输出任意一种合法顺序」11 拓扑排序
图是有向的且要问顺序11 拓扑排序
「判断这张图是不是一棵树」12 并查集
「加上这条边会不会形成环」12 并查集
「把有共同元素的集合归并」(账户、邮箱、字符串)12 并查集
「有多少个连通分量 / 省份 / 朋友圈 / 组」12 并查集
「等式约束是否自洽」(a==b, b!=c)12 并查集
边是一条条流进来的,中途还要回答问题12 并查集
「0 和 1 数量相同的最长子数组」13 前缀和
「区间和 / 范围求和」且要多次查询13 前缀和
「和恰好为 K 的子数组个数 / 最长长度」13 前缀和
「能被 K 整除的子数组」13 前缀和
「除自身以外数组的乘积」且不许用除法13 前缀和
二维矩阵的「子矩形和」13 前缀和
「合并重叠区间」14 区间
「插入一个新区间并合并」14 区间
「最少删掉几个使其互不重叠」14 区间
「用最少的箭射爆所有气球」「区间覆盖」14 区间
「需要几间会议室 / 最多同时有几个」14 区间
输入是一堆 [start, end]14 区间
「划分标签 / 最少分成几段」15 贪心
「加油站能否绕一圈」「从哪个位置出发」15 贪心
「按顺序发牌 / 分成若干连续组」15 贪心
「最大子数组和」15 贪心
「能否到达 / 最少几步到达」且每一步的选择不影响后面的结构15 贪心
题面在问「最优值」而你能一句话说清每步该选谁15 贪心
「不能取相邻的两个」16 一维 DP
「以 i 结尾的最长 / 最大」16 一维 DP
「凑出金额 / 能否拆分成若干段」16 一维 DP
「有多少种方法 / 最少多少步」且答案只由前几项决定16 一维 DP
数据规模 10⁴~10⁵ 且要最优值16 一维 DP
环形(首尾相接)16 一维 DP
「两个字符串 / 两个数组」比较、匹配、对齐17 二维 DP 与背包
「加减号 / 分成两组」凑出目标17 二维 DP 与背包
「带冷冻期 / 手续费的股票」17 二维 DP 与背包
「编辑距离 / 最长公共子序列 / 通配符匹配」17 二维 DP 与背包
「网格里从左上走到右下」(路径数 / 最小路径和)17 二维 DP 与背包
「能否把数组分成和相等的两半」17 二维 DP 与背包
「子序列」+「最长 / 最多」且只有一个序列18 子序列 DP
「最少用几个不升序列覆盖」18 子序列 DP
「最长上升 / 递增子序列」(不要求连续)18 子序列 DP
「最长可整除子集 / 最长字符串链」18 子序列 DP
「最长数对链 / 俄罗斯套娃信封」18 子序列 DP
「有多少个最长上升子序列」18 子序列 DP
§4 Template Index 模板口诀

考前只需要扫这一列

模式模板默写口诀 / 用途
01 哈希模板 A · 配对先查后存
01 哈希模板 B · 分组给每个元素算一个签名
02 双指针模板 A · 相向双指针两端起步、小了动左、大了动右
02 双指针模板 B · 同向快慢原地覆盖类
03 滑动窗口模板 A · 可变窗口右扩、不合法就左缩、合法后统计
03 滑动窗口模板 B · 定长窗口窗口大小 k 固定
04 栈与单调栈模板 A · 下一个更大元素存下标、递减栈、弹出即结账
04 栈与单调栈模板 B · 单调队列仅 239 一题需要,认脸级
05 二分查找模板 A · 边界二分左闭右开、lo = mid + 1 / hi = mid、返回 lo
05 二分查找模板 B · 答案二分判定函数才是题目本身
06 链表模板 A · 反转存 next、改指向、双双前进
06 链表模板 B · 哨兵 + 双指针合并 / 删除类
07 树的遍历与递归模板 A · 递归三问空的返回什么、左右各要什么、当前怎么合
07 树的遍历与递归模板 B · 层序 BFS凡是带「层」字的题
08 堆 / Top-K模板 A · 大小为 K 的堆入堆、超员、踢堆顶
08 堆 / Top-K模板 B · 对顶堆仅动态中位数需要,认脸级
09 回溯模板 A · 组合 / 子集选、递归、撤销
09 回溯模板 B · 排列靠 used 数组标记占用
10 图的 BFS/DFS模板 A · 网格 DFS越界就回、不该走就回、进来先标记、再走四个方向
10 图的 BFS/DFS模板 B · 多源 BFS最少步数
11 拓扑排序模板 A · Kahn 入度法建图数入度、零入度入队、出队减邻居、计数判环
12 并查集模板 A · 并查集find 一路压缩、union 小挂大、返回 False 即成环
13 前缀和模板 A · 前缀和数组长度 n+1、pre[0]=0、区间取两端之差
13 前缀和模板 B · 前缀和 + 哈希「恰好为 K」类
14 区间模板 A · 排序 + 合并排序、重叠就并、否则新开一段
14 区间模板 B · 扫描线求同时进行的最大数量
15 贪心模板 A · 一路维护一个量一个 cur 一个 best,每步只问一句该不该重来
15 贪心模板 B · 先扫一遍再分段划分 / 分组类
16 一维 DP模板 A · 线性 DP两个变量滚着走,每步只问选不选
16 一维 DP模板 B · 按容量填表凑金额 / 能否拆分
17 二维 DP 与背包模板 A · 双序列 / 网格 DP多开一圈边界、对上走对角、没对上各退一步
17 二维 DP 与背包模板 B · 01 背包(一维)选或不选,容量倒序
18 子序列 DP模板 A · O(n²) LIS以 i 结尾、回头看 j、能接就接、答案取 max(dp)
18 子序列 DP模板 B · 耐心排序 + 二分O(n log n),面试主推