riglen
发布于 2026-04-20 / 4 阅读
0

题型知识速查表

题型识别速查表(看到什么 -> 想到什么)

目标:

  • 不是背题,而是做“题目特征 -> 解法模型”的映射
  • 刷题时先识别模型,再套思路
  • 这是偏实战版,不追求百科全书式覆盖,但已经能覆盖大部分常见题型

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. 你现在最值得优先掌握的高频模型(按性价比排序)

  1. 哈希
  2. 双指针
  3. 滑动窗口
  4. 快慢指针
  5. 二叉树递归
  6. BFS / DFS
  7. 回溯
  8. 二分
  9. 动态规划基础
  10. 单调栈
  11. 并查集 / 拓扑排序

对 Java 后端刷题来说,先把这些吃透,性价比最高。