本页由 scripts/gen_topics.py 生成,勿手编。 改题解的 topics:/techniques:/元数据行后跑一次脚本即可。

三级结构:套路(为什么这些题是同一类) → 技术词(具体用哪一招) → 题目。 一题可以横跨多个套路(如「接雨水」同时是数组、双指针、单调栈),各处指向的是同一份物理题解。

频次:★★★★★ 几乎必考 / ★★★★ 高频 / ★★★ 常见 / ★★ 偶考。难度:🟢 易 / 🟡 中 / 🔴 难。 难度/频次/公司以题解元数据行为权威源,本页是它的视图。公司标注为大致倾向,以实际面试为准。

相关:高频题目索引(按热度排序,跨套路)。 总览:算法总览(框架思维 + 方法论 + 学习路径)。

怎么用这份索引

  1. 按套路刷,不按题号刷。每个套路先做代表题建立模式,再横向扩展变式——套路页里「为什么这些题是同一个套路」才是主线。
  2. 技术词是套路内部的分工。同一个套路下的技术词彼此不可替代(如双指针下的「对撞指针」与「滑动窗口」),搞混了就会硬套模板。
  3. 高频题(★★★★★)优先,见 高频算法题 Top 40
  4. 每题留 Java 解 + 复杂度 + 一句变式;难题写关联题互链,## 关联题 是知识图谱的边。
  5. 推荐顺序:数组/链表/二叉树 → 双指针滑窗/二分/哈希表 → 回溯/动态规划 → 图论/栈与队列 → 排序与堆/字典树/位运算。

套路速查

共 14 个套路、57 个技术词、266 篇题解。

套路题数技术词
数组与字符串43原地读写指针 / 对撞指针 / 前缀和与差分 / 线性扫描维护状态 / 矩阵操作 / 模拟构造 / 滑动窗口 / 哈希查表 / 区间排序 / 摩尔投票 / 快慢指针 / 位运算 / Z字形查找
链表22虚拟头节点 / 三指针反转 / 快慢指针 / 节点映射 / 双指针归并 / 双指针模拟
栈与队列13表达式与嵌套栈 / 单调栈与单调队列 / 栈队列设计
哈希表12哈希查表 / 哈希+辅助结构
双指针与滑动窗口13对撞指针 / 滑动窗口 / 原地读写指针 / 双指针模拟
二分查找10二分边界 / 跳表设计
二叉树39递归 / 递归返回值设计 / BFS层序 / BST中序 / DFS / 树的构造与序列化 / 回溯框架 / 栈模拟递归
图论22图遍历 / DFS / 拓扑排序 / 并查集 / 最短路
回溯17回溯框架 / 剪枝
动态规划与贪心62线性DP / 二维DP / 股票状态机DP / 背包 / 贪心证明 / 线性扫描维护状态 / 中心扩展
排序与堆12排序算法实现 / 堆TopK / 快速选择 / 区间排序 / 多路归并 / 对顶堆
字典树6Trie前缀树 / 哈希查表
位运算6异或自反 / 位掩码枚举 / 逐位构造
数学4拒绝采样 / 快速幂 / 模拟构造

数组与字符串

数组题的大部分”技巧”其实只有两类——用下标/原地交换省掉额外空间,或者用一次预处理把重复计算的区间查询/更新降到 O(1)。认出属于哪一类,思路就定了一半。

详解见 数组与字符串

原地读写指针

对撞指针

前缀和与差分

线性扫描维护状态

矩阵操作

模拟构造

滑动窗口

哈希查表

区间排序

摩尔投票

快慢指针

位运算

Z字形查找

链表

链表题几乎都是指针操作的模式化组合,真正的武器只有两件——虚拟头节点(dummy)消灭”头节点要不要特判”的分支,和快慢指针。认出该用哪件武器,代码本身反而是最不费脑子的部分。

详解见 链表

虚拟头节点

三指针反转

快慢指针

节点映射

双指针归并

双指针模拟

栈与队列

栈解决”最近的还没处理完”(括号匹配、表达式求值、函数调用),队列解决”先来的先处理”(层序遍历、BFS)。单调栈/单调队列是在此之上加了一条淘汰规则——不是谁都留在栈/队列里,而是只留下”未来还可能有用”的那些。

详解见 栈与队列

表达式与嵌套栈

单调栈与单调队列

栈队列设计

哈希表

哈希表把”这个东西之前见过吗/出现过几次/对应什么”这类查询降到 O(1)。凡是暴力解法里有一层”遍历前面所有元素,看有没有满足条件的”,几乎都能用哈希表把那层遍历换成一次查表。

详解见 哈希表

哈希查表

哈希+辅助结构

双指针与滑动窗口

两个指针能把很多 O(n²) 的暴力枚举降到 O(n),前提是移动指针时能保证不会漏掉正确答案——这个前提是否成立,取决于指针是”对撞”还是”同向”,而滑动窗口只是”同向双指针”的一种特殊形态。

详解见 双指针与滑动窗口

对撞指针

滑动窗口

原地读写指针

双指针模拟

二分查找

二分查找的必要条件不是”数组有序”,而是**“答案空间上存在一个单调的判定条件”**——能把问题转化成”在一段区间里找到条件由假变真的那个分界点”,就能二分,哪怕数组本身看起来是”无序”的。

详解见 二分查找

二分边界

跳表设计

二叉树

几乎所有二叉树题都能套进同一个框架——“整棵树的答案 = 用根节点的信息,组合左右子树各自的答案”。想清楚”子树需要返回什么信息给父节点”,代码基本就写出来了;唯一的例外是层序遍历,它天生是迭代(BFS)而非递归的活。

详解见 二叉树

递归

递归返回值设计

BFS层序

BST中序

DFS

树的构造与序列化

回溯框架

栈模拟递归

图论

图是”允许有环、允许多个父节点”的树,所以树的 DFS/BFS 在图上全部适用,只是多了一件必须做的事——记录访问过的节点,否则会在环里死循环。图论题的额外技巧(拓扑排序、并查集)都是为了处理树没有的两个新问题:依赖顺序动态连通性

详解见 图论

图遍历

DFS

拓扑排序

并查集

最短路

回溯

回溯就是 DFS 加上一句”撤销现场”——穷举所有可能解的通用框架是「做选择 → 递归进入下一层 → 撤销选择」,三步缺一不可。写不出撤销那一步,是这类题最常见的翻车原因。

详解见 回溯

回溯框架

剪枝

动态规划与贪心

动态规划和贪心都是”不穷举所有解,靠某个性质剪掉大部分选择”,区别在于动态规划把每一步的所有候选都存下来供后面复用,贪心直接证明”每一步只保留一个候选就够了”。判断一道题该用哪个,比写出代码本身更考验功力,也是这一页真正的价值所在。

详解见 动态规划与贪心

线性DP

二维DP

股票状态机DP

背包

贪心证明

线性扫描维护状态

中心扩展

排序与堆

需要”全部有序”就用排序;只需要”前 K 个”或”动态维护当前最值”,用堆——堆的本质是一棵只保证”父节点比子节点更优”、不要求兄弟节点之间有序的弱化二叉树,正是这个弱化换来了 O(log n) 的插入/取出,比维护整体有序便宜得多。

详解见 排序与堆

排序算法实现

堆TopK

快速选择

区间排序

多路归并

对顶堆

字典树

字典树(Trie)是”用公共前缀换空间和查询效率”的哈希表替代品——当查询模式是”前缀匹配”而不是”精确匹配”时,哈希表无能为力(它只能判断整个字符串是否存在),字典树天然适合。

详解见 字典树

Trie前缀树

哈希查表

位运算

位运算题的价值几乎都来自异或(XOR)的两条性质——自反性(a^a=0)让”找落单元素”不需要额外空间无进位加法的特性让它能模拟加法。认出题目在利用哪一条,解法基本就出来了。

详解见 位运算

异或自反

位掩码枚举

逐位构造

数学

数学题在算法面试中的考察点往往不是高深的数论,而是如何把现实问题抽象成数学模型,再用程序表达——拒绝采样、概率均等、模运算性质是最高频的三个工具。

详解见 数学

拒绝采样

快速幂

模拟构造