题型识别速查表(看到什么 -> 想到什么)
目标:
- 不是背题,而是做“题目特征 -> 解法模型”的映射
- 刷题时先识别模型,再套思路
- 这是偏实战版,不追求百科全书式覆盖,但已经能覆盖大部分常见题型
1. 数组 / 字符串基础类
- 看到“遍历数组,找某个值/统计次数” -> 直接遍历 / 哈希表计数
- 看到“求是否存在重复元素” -> HashSet / 排序后判断相邻
- 看到“两个数组求交集/差集/包含关系” -> 哈希集合
- 看到“频次最高 / 出现次数统计” -> HashMap 计数
- 看到“多数元素 > n/2” -> 摩尔投票
- 看到“出现次数前 K 高” -> 小顶堆 / 桶排序 / 快速选择
- 看到“数组原地删除元素” -> 快慢指针
- 看到“移动 0 到末尾” -> 快慢指针
- 看到“合并两个有序数组” -> 双指针
- 看到“判断两个字符串是否同构 / 字母异位词” -> 哈希计数 / 数组计数
- 看到“字符串字符频次统计” -> int[26] / HashMap
- 看到“反转字符串 / 局部反转” -> 双指针
- 看到“回文串判断” -> 双指针
- 看到“忽略非字母数字判断回文” -> 双指针 + 条件跳过
- 看到“压缩字符串 / 原地覆盖” -> 双指针
- 看到“Excel 列名 / 26 个字母循环映射” -> 进制转换 / 取余
- 看到“字符串和数字互相转换” -> 模拟 / 进制 / 边界处理
- 看到“加法器、乘法器、二进制求和” -> 模拟进位
- 看到“版本号比较 / 字符串表达式解析” -> 分割 / 双指针 / 模拟
2. 双指针
2.1 左右指针
- 看到“有序数组中两数之和” -> 左右双指针
- 看到“盛最多水的容器” -> 左右双指针,移动短板
- 看到“判断回文串” -> 左右双指针
- 看到“删除一个字符后是否还能回文” -> 左右双指针 + 分支判断
- 看到“有序数组去重” -> 快慢指针(本质也是双指针)
2.2 快慢指针
- 看到“原地删除 / 原地去重 / 保留满足条件元素” -> 快慢指针
- 看到“链表找环” -> 快慢指针
- 看到“链表中点” -> 快慢指针
- 看到“倒数第 k 个节点” -> 快慢指针 / 间隔 k
- 看到“判断快乐数 / 数字转换成下一个状态是否成环” -> 快慢指针(抽象成链表)
2.3 三指针 / 多指针
- 看到“颜色分类 0/1/2” -> 三指针(荷兰国旗问题)
- 看到“多个区间合并 / 多路归并” -> 多指针 / 堆
3. 滑动窗口
- 看到“连续子数组 / 连续子串” -> 滑动窗口优先想
- 看到“最长不重复子串” -> 滑动窗口 + 哈希
- 看到“最小覆盖子串” -> 滑动窗口 + 计数
- 看到“长度最小的子数组,其和 >= target” -> 滑动窗口(前提通常是正数)
- 看到“固定长度 k 的子数组最大值/平均值” -> 定长滑动窗口
- 看到“至多包含 K 种字符” -> 滑动窗口 + HashMap 计数
- 看到“最多替换 k 次后最长重复字符” -> 滑动窗口 + 维护窗口条件
- 看到“乘积小于 k 的子数组个数(全正数)” -> 滑动窗口
- 看到“连续区间,满足某个条件时扩张,不满足时收缩” -> 滑动窗口
滑动窗口识别关键
- 题目强调“连续”
- 求“最长/最短/个数”
- 窗口内满足某种约束
- 常见关键词:substring / subarray / 连续 / 最长 / 最短 / 至多 / 至少
4. 前缀和 / 差分
4.1 前缀和
- 看到“多次询问区间和” -> 前缀和
- 看到“子数组和等于 k 的个数” -> 前缀和 + 哈希
- 看到“连续子数组和能否被 k 整除” -> 前缀和 % k + 哈希
- 看到“二维区域和查询” -> 二维前缀和
- 看到“统计某区间内 0/1 个数” -> 前缀和
4.2 差分
- 看到“区间批量加减,最后求结果” -> 差分数组
- 看到“航班预订统计 / 批量修改区间” -> 差分
- 看到“二维矩阵范围更新” -> 二维差分
识别关键
- 多次区间查询 -> 前缀和
- 多次区间更新 -> 差分
5. 二分查找
5.1 标准二分
- 看到“有序数组找目标” -> 二分
- 看到“找某值第一次出现 / 最后一次出现” -> 二分边界
- 看到“插入位置” -> 二分
- 看到“旋转有序数组找目标” -> 二分 + 分段有序判断
- 看到“山脉数组峰值 / 局部峰值” -> 二分
5.2 答案二分
- 看到“求最小的可行值 / 最大的满足值” -> 二分答案
- 看到“最小速度 / 最小容量 / 最大最小值 / 最小最大值” -> 二分答案
- 看到“给定答案 x,能否做到” -> check 函数 + 二分
二分识别关键
- 数据有序,或者题目存在单调性
- 不是直接找元素,而是“找满足条件的边界”
- 常见句式:
- 最小的……
- 最大的……
- 至少……
- 至多……
- 是否可以……
6. 哈希
- 看到“查找是否存在某元素/某关系” -> 哈希
- 看到“两数之和” -> 哈希
- 看到“分组异位词” -> 排序作为 key / 字符计数作为 key
- 看到“连续序列最长长度” -> HashSet
- 看到“复制带随机指针链表” -> 哈希映射旧节点到新节点
- 看到“判断是否有重复 / 附近重复 / 距离限制重复” -> HashSet / HashMap
- 看到“前缀和出现过没有” -> 哈希
- 看到“频率统计、映射关系、去重” -> 哈希优先想
7. 链表
- 看到“反转链表” -> 迭代反转 / 递归反转
- 看到“删除链表节点” -> 找前驱 / 虚拟头结点
- 看到“合并两个有序链表” -> 双指针
- 看到“合并 K 个有序链表” -> 堆 / 分治
- 看到“链表是否有环” -> 快慢指针
- 看到“环入口” -> 快慢指针数学结论
- 看到“找中点” -> 快慢指针
- 看到“倒数第 k 个节点” -> 快慢指针
- 看到“回文链表” -> 找中点 + 反转后半段 + 比较
- 看到“重排链表” -> 找中点 + 反转 + 交叉合并
- 看到“链表排序” -> 归并排序
- 看到“随机指针 / 深拷贝” -> 哈希 / 拆分复制
- 看到“删除头节点也可能删” -> 虚拟头结点优先
- 看到“每 k 个一组反转” -> 分组模拟 + 局部反转
链表常用套路
- 虚拟头结点:处理头节点删除/插入
- 快慢指针:环、中点、倒数第 k 个
- 反转链表:一大堆链表题核心基础操作
8. 栈 / 单调栈
8.1 普通栈
- 看到“括号匹配” -> 栈
- 看到“表达式求值 / 逆波兰表达式” -> 栈
- 看到“路径化简” -> 栈
- 看到“字符串消消乐 / 相邻字符抵消” -> 栈
- 看到“递归改迭代” -> 栈模拟
8.2 单调栈
- 看到“下一个更大元素 / 下一个更小元素” -> 单调栈
- 看到“每日温度” -> 单调栈
- 看到“柱状图中最大矩形” -> 单调栈
- 看到“接雨水” -> 单调栈 / 双指针
- 看到“寻找左边/右边第一个比我大/小的元素” -> 单调栈
单调栈识别关键
- 对每个元素,找它左边/右边第一个更大/更小
- 题目是“最近更大/更小”
- 暴力 O(n^2) 很明显,但要优化到 O(n)
9. 队列 / 单调队列 / 堆
9.1 队列
- 看到“层序遍历” -> 队列
- 看到“BFS” -> 队列
- 看到“最近请求次数 / 数据流窗口” -> 队列
9.2 单调队列
- 看到“滑动窗口最大值 / 最小值” -> 单调队列
- 看到“固定窗口内求最大最小,并且要求 O(n)” -> 单调队列
9.3 堆(优先队列)
- 看到“前 K 大 / 前 K 小” -> 堆
- 看到“数据流中位数” -> 两个堆
- 看到“合并 K 个有序链表” -> 小顶堆
- 看到“会议室安排 / 区间资源分配” -> 堆
- 看到“频率前 K 高” -> 小顶堆
- 看到“不断取当前最值再更新” -> 堆
- 看到“最短路径 Dijkstra” -> 最小堆
10. 树
10.1 遍历类
- 看到“树的前中后序遍历” -> 递归 / 栈模拟
- 看到“层序遍历” -> BFS 队列
- 看到“之字形层序” -> BFS + 翻转 / 双端队列
10.2 递归定义类
- 看到“判断两棵树是否相同 / 是否镜像 / 是否对称” -> 递归
- 看到“最大深度 / 最小深度” -> 递归 / BFS
- 看到“是否平衡二叉树” -> 后序递归
- 看到“路径总和 / 所有路径” -> DFS / 回溯
- 看到“最近公共祖先” -> 递归
- 看到“翻转二叉树” -> 递归 / BFS
- 看到“验证二叉搜索树” -> 中序遍历 / 递归上下界
- 看到“二叉树展开成链表” -> 递归 / 前驱拼接
- 看到“从前序中序构建树” -> 递归 + 哈希定位
- 看到“序列化/反序列化二叉树” -> 前序/BFS 模拟
10.3 BST 特性类
- 看到“二叉搜索树查找 / 插入 / 删除” -> 利用 BST 左小右大
- 看到“BST 第 k 小” -> 中序遍历
- 看到“BST 转有序结果” -> 中序
- 看到“最近值 / 范围和” -> BST 剪枝
树题识别关键
- 先问自己:是遍历,还是递归定义,还是利用 BST 性质?
- 二叉树 80% 题都能从这三个方向切
11. 图
11.1 图遍历
- 看到“连通块个数 / 岛屿数量” -> DFS / BFS / 并查集
- 看到“矩阵中从某点扩散” -> BFS / DFS
- 看到“课程表是否能学完” -> 拓扑排序 / DFS 判环
- 看到“克隆图” -> DFS / BFS + 哈希
11.2 最短路径
- 看到“无权图最短路径” -> BFS
- 看到“边权非负最短路径” -> Dijkstra
- 看到“有负权边最短路” -> Bellman-Ford / SPFA(面试少)
- 看到“所有点对最短路” -> Floyd(面试少)
11.3 拓扑排序
- 看到“任务依赖 / 课程依赖 / 安装顺序” -> 拓扑排序
- 看到“判断图中是否有环(有向图)” -> 拓扑排序 / DFS 染色
11.4 并查集
- 看到“动态连通性 / 是否连通 / 成环判断” -> 并查集
- 看到“冗余连接” -> 并查集
- 看到“岛屿合并 / 省份数量” -> 并查集
- 看到“等式方程可满足性” -> 并查集
图题识别关键
- 网格问题通常先想成图
- 无权最短路 -> BFS
- 依赖关系 -> 拓扑排序
- 连通性合并 -> 并查集
12. 回溯
- 看到“求所有组合” -> 回溯
- 看到“求所有子集” -> 回溯
- 看到“求所有排列” -> 回溯
- 看到“字符串切割成所有合法方案” -> 回溯
- 看到“N 皇后” -> 回溯
- 看到“电话号码字母组合” -> 回溯
- 看到“组合总和” -> 回溯
- 看到“括号生成” -> 回溯
- 看到“棋盘放置 / 路径枚举 / 所有可能结果” -> 回溯
回溯识别关键
- 题目要“所有解”
- 不是求一个最优值,而是列举所有可能
- 常见关键词:所有、全部、组合、排列、子集、方案、路径
回溯三问
- 路径是什么?
- 选择列表是什么?
- 结束条件是什么?
13. 动态规划(DP)
13.1 线性 DP
- 看到“爬楼梯” -> 线性 DP
- 看到“打家劫舍” -> 线性 DP
- 看到“最小花费爬楼梯” -> 线性 DP
- 看到“解码方法” -> 线性 DP
- 看到“丑数 / 丑数 II” -> DP / 多指针
13.2 子序列 / 字符串 DP
- 看到“最长公共子序列” -> 二维 DP
- 看到“编辑距离” -> 二维 DP
- 看到“最长回文子序列” -> 区间 DP
- 看到“最长回文子串” -> 中心扩展 / DP
- 看到“判断子序列” -> 双指针 / DP
- 看到“不同子序列个数” -> DP
13.3 背包 DP
- 看到“从若干物品中选,满足容量/和,求最大值/方案数/可行性” -> 背包
- 看到“目标和 / 分割等和子集” -> 0-1 背包变形
- 看到“零钱兑换” -> 完全背包
- 看到“组合总数 / 凑数方案数” -> 背包计数
13.4 区间 DP
- 看到“戳气球 / 合并石头 / 括号消除” -> 区间 DP
- 看到“子串范围内求最优” -> 区间 DP
13.5 状态机 DP
- 看到“股票买卖” -> 状态机 DP
- 看到“有限状态转移,持有/不持有/冷冻期” -> 状态机 DP
13.6 树形 DP
- 看到“树上选点 / 不相邻节点最大和” -> 树形 DP
- 看到“打家劫舍 III” -> 树形 DP
DP 识别关键
- 最优子结构
- 重复子问题
- 求最大/最小/方案数/是否可行
- 往往有“当前位置的答案依赖前面状态”
DP 五步法
- 定义 dp[i] / dp[i][j] 含义
- 写状态转移
- 初始化
- 确定遍历顺序
- 手推样例验证
14. 贪心
- 看到“每一步做局部最优,最后能得到全局最优” -> 贪心
- 看到“跳跃游戏” -> 贪心
- 看到“区间覆盖 / 最少区间数量” -> 贪心
- 看到“分发饼干” -> 排序 + 贪心
- 看到“会议室安排 / 无重叠区间” -> 按结束时间排序贪心
- 看到“买卖股票 II” -> 贪心
- 看到“加油站” -> 贪心
- 看到“划分字母区间” -> 贪心
- 看到“尽量多选 / 尽量早结束 / 尽量小代价” -> 贪心常见信号
贪心识别关键
- 题目像是在做选择
- 每步选择不回头
- 通常搭配排序
- 需要能证明“局部最优推出全局最优”
15. 排序
- 看到“区间合并 / 插入区间 / 无重叠区间” -> 先排序
- 看到“按某维度处理对象集合” -> 排序
- 看到“最大数 / 最小字典序拼接” -> 自定义排序
- 看到“合并会议、课程安排、区间题” -> 排序优先想
- 看到“第 K 大” -> 排序 / 堆 / 快速选择
- 看到“乱序数组但要找规律” -> 排序后处理
16. 位运算
- 看到“只出现一次,其他都出现两次” -> 异或
- 看到“判断 2 的幂 / 4 的幂” -> 位运算
- 看到“统计二进制 1 的个数” -> lowbit / n & (n - 1)
- 看到“子集枚举” -> 位掩码
- 看到“状态压缩” -> 位运算 DP / DFS
- 看到“数组中两个只出现一次的数” -> 异或分组
- 看到“缺失数字、重复数字,有异或味道” -> 异或/数学
位运算识别关键
- 题目跟二进制、奇偶、开关、集合状态有关
- 要求常数空间、高效去重、状态压缩
17. 数学 / 模拟
- 看到“数字翻转 / 回文数” -> 数学模拟
- 看到“阶乘后缀 0 / 快速幂 / GCD / LCM” -> 数学规律
- 看到“约瑟夫环” -> 数学递推
- 看到“丑数 / 质数 / 因子” -> 数学
- 看到“字符串按规则转换” -> 模拟
- 看到“螺旋矩阵 / 杨辉三角 / Z 字变换” -> 模拟
- 看到“整数除法但不能用 / * / %” -> 位运算 + 模拟
- 看到“分数、小数展开、进制转换” -> 模拟 + 哈希
数学题识别关键
- 暴力会超时,但数据规律强
- 样例少但规律明显
- 需要推公式、找不变量、考虑边界
18. 设计题
- 看到“设计 LRU” -> 哈希表 + 双向链表
- 看到“O(1) 插入删除随机访问” -> 数组 + 哈希
- 看到“最小栈” -> 辅助栈
- 看到“实现队列/栈” -> 栈/队列互相模拟
- 看到“前缀树” -> Trie
- 看到“数据流中位数” -> 两个堆
- 看到“支持区间查询和修改” -> 线段树 / 树状数组(高频稍低)
- 看到“缓存淘汰策略” -> 哈希 + 链表 / 堆
19. Trie(前缀树)
- 看到“单词前缀匹配” -> Trie
- 看到“搜索建议系统” -> Trie / 排序 + 二分
- 看到“单词字典,支持通配符” -> Trie + DFS
- 看到“词典树 + 字符搜索” -> Trie
- 看到“大量字符串,反复查前缀/词根” -> Trie
20. 区间问题
- 看到“若干区间,求合并结果” -> 排序后合并
- 看到“插入新区间” -> 排序 / 分类处理
- 看到“最少删几个区间使不重叠” -> 排序 + 贪心
- 看到“会议室能否安排 / 需要多少会议室” -> 排序 / 堆
- 看到“气球引爆最少箭数” -> 排序 + 贪心
- 看到“区间覆盖、选择、调度” -> 排序 + 贪心
21. 单调性 / 不变量 / 规律题
- 看到“操作过程很多,但状态有某种单调变化” -> 单调性分析
- 看到“经过一系列操作后结果是否可能” -> 不变量 / 奇偶性
- 看到“相邻交换 / 变换次数 / 可达性” -> 不变量、逆序对、奇偶性
- 看到“不断消除,最后剩什么” -> 栈 / 不变量 / 抵消思想
- 看到“石子游戏 / 博弈变形” -> 找规律 / DP / 奇偶分析
22. 网格类(矩阵)
- 看到“岛屿数量 / 连通区域” -> DFS / BFS / 并查集
- 看到“矩阵最短路径” -> BFS
- 看到“从某点扩散,分层传播” -> BFS
- 看到“矩阵中路径搜索” -> DFS / 回溯
- 看到“二维区域和” -> 二维前缀和
- 看到“二维批量更新” -> 二维差分
- 看到“按层旋转 / 螺旋遍历” -> 模拟
23. 字符串高级一点的题
- 看到“模式匹配” -> KMP / 双指针 / 哈希
- 看到“最短/最长满足条件子串” -> 滑动窗口
- 看到“回文子串 / 最长回文子串” -> 中心扩展 / DP / Manacher(面试少)
- 看到“重复子串 / 周期字符串” -> KMP / 数学规律
- 看到“括号串合法、最长合法括号” -> 栈 / DP
- 看到“表达式加括号求值” -> 递归 / 栈 / 分治
24. Top K / 第 K 类问题
- 看到“前 K 大 / 前 K 小” -> 堆
- 看到“第 K 大元素” -> 堆 / 快速选择
- 看到“前 K 高频元素” -> 堆 / 桶排序
- 看到“有序矩阵第 K 小” -> 堆 / 二分答案
- 看到“第 K 个最小路径和 / 对数对” -> 堆
25. 经典题型的第一反应
- 看到“有序数组找目标” -> 二分
- 看到“连续子数组/子串” -> 滑动窗口 / 前缀和
- 看到“区间和查询” -> 前缀和
- 看到“区间批量修改” -> 差分
- 看到“出现次数 > n/2” -> 摩尔投票
- 看到“前 K 个” -> 堆
- 看到“最近更大/更小” -> 单调栈
- 看到“滑动窗口最大值” -> 单调队列
- 看到“链表找环” -> 快慢指针
- 看到“链表反转” -> 指针翻转
- 看到“树的遍历” -> 递归 / 栈 / 队列
- 看到“二叉搜索树” -> 利用左小右大
- 看到“网格最短路” -> BFS
- 看到“无权图最短路” -> BFS
- 看到“有权非负最短路” -> Dijkstra
- 看到“依赖关系” -> 拓扑排序
- 看到“连通性合并” -> 并查集
- 看到“所有组合/子集/排列” -> 回溯
- 看到“最优值 + 重复子问题” -> DP
- 看到“局部最优可能推出全局最优” -> 贪心
- 看到“字符串前缀匹配” -> Trie
- 看到“只出现一次,其余都成对” -> 异或
- 看到“26 个字母循环映射” -> 进制 / 取余 / 模拟
26. 一张更实用的“判断顺序”
拿到题先问自己:
第一步:数据结构是什么?
- 数组?
- 链表?
- 树?
- 图?
- 字符串?
- 矩阵?
第二步:题目要什么?
- 一个值?
- 最优值?
- 是否可行?
- 所有方案?
- 前 K 个?
- 区间结果?
第三步:有没有明显信号?
- 连续 -> 滑动窗口 / 前缀和
- 有序 -> 二分 / 双指针
- 前 K -> 堆
- 所有方案 -> 回溯
- 最短路径 -> BFS / Dijkstra
- 出现次数 -> 哈希 / 摩尔投票
- 左右最近更大更小 -> 单调栈
- 区间查询 -> 前缀和
- 区间更新 -> 差分
- 依赖关系 -> 拓扑排序
- 连通性 -> DFS/BFS/并查集
- 最优值 + 状态转移 -> DP
27. 你刷题时最该记住的“模型触发词”
数组
- 连续、最长、最短 -> 滑动窗口
- 有序 -> 二分 / 双指针
- 频次 -> 哈希
- 多数 -> 摩尔投票
- 前 K -> 堆
链表
- 环 -> 快慢指针
- 删除头节点可能变化 -> 虚拟头结点
- 局部反转 / 整体反转 -> 链表反转
树
- 遍历 -> 递归 / 栈 / 队列
- BST -> 中序 / 剪枝 / 左小右大
- 路径 -> DFS / 回溯
图
- 最短路 -> BFS / Dijkstra
- 依赖 -> 拓扑排序
- 连通块 -> DFS / BFS / 并查集
回溯
- 所有方案、全部结果 -> 回溯
DP
- 最大/最小/方案数/可行性,且状态依赖前面 -> DP
28. 最后一句话版
- 连续 -> 窗口 / 前缀和
- 有序 -> 二分 / 双指针
- 前 K -> 堆
- 频次 -> 哈希
- 多数 -> 摩尔投票
- 最近更大更小 -> 单调栈
- 滑动最值 -> 单调队列
- 链表环 / 中点 / 倒数第 k -> 快慢指针
- 树遍历 -> 递归 / 栈 / 队列
- 网格最短路 / 扩散 -> BFS
- 依赖关系 -> 拓扑排序
- 连通性 -> DFS / BFS / 并查集
- 所有解 -> 回溯
- 最优解 + 重复子问题 -> DP
- 局部最优 -> 贪心
29. 适合你做笔记时的最简模板
题目:XXX
- 题型:
- 看到什么信号:
- 第一反应应该想到:
- 核心模板:
- 易错点:
- 同类题:
30. 你现在最值得优先掌握的高频模型(按性价比排序)
- 哈希
- 双指针
- 滑动窗口
- 快慢指针
- 二叉树递归
- BFS / DFS
- 回溯
- 二分
- 动态规划基础
- 单调栈
- 堆
- 并查集 / 拓扑排序
对 Java 后端刷题来说,先把这些吃透,性价比最高。