跳转至

🚀 面试算法 (Coding Interview & CP Wiki)

欢迎查阅 面试算法!这是一个系统化、竞赛级的高频算法与数据结构知识库。

本项目专为国内外一线互联网大厂技术面试、LeetCode 周赛高分冲刺以及各类算法竞赛(ICPC / CCPC / Codeforces / AtCoder)量身打造,涵盖 65 个核心技术模块 与 300+ 道精选高频真题与系统设计实战。


💡 核心特色与设计哲学

为什么选择本知识库?

  • 深入数学底层,拒绝死记硬背:不仅提供代码模板,更给出严谨的数学推导与正确性证明(如树状数组二进制划分定理、树的直径若尔当定理、卡特兰数反射原理、Fisher-Yates 洗牌望远消去证明等);
  • 现代化 C++ 工业级标准:全库代码采用现代 C++ 标准实现,注重内存局部性、Cache 友好性与位运算常数优化;
  • 折叠题解,沉浸式实战思考:全站 290+ 道精选题均配有 ??? tip "提示" 可折叠思路拆解,支持先自主思考再对照查阅,覆盖最优时间与空间复杂度。

🗺️ 全站知识图谱与核心模块索引

mindmap
  root((面试算法知识库))
    基础与通用工具
      C++ 核心常识与底层陷阱
      算法复杂度与主定理
      计算复杂性理论 P/NP/NPC
      二分与三分搜索
      分治算法与平面最近点对
      搜索算法与六大剪枝
      排序与快速选择
      MEX与摩尔投票
      Two Sum 与 K-Sum
      接雨水专题
      括号序列专题
    贪心算法专题
      核心理论与证明范式
      区间贪心与覆盖模型
      排序不等式与全序比较
      序列推进与双向贪心
      反悔贪心与优先队列
    核心数据结构
      并查集与带权DSU
      树状数组 BIT
      线段树 Segment Tree
      ST 表 RMQ
      堆与对顶堆
      平衡树 AVL/红黑树/FHQ-Treap
    图论核心算法
      最短路 Dijkstra/Floyd
      差分约束系统
      最小生成树 Kruskal/Prim
      最近公共祖先 LCA
      树的直径 Tree Diameter
      树链剖分 HLD
      拓扑排序与分层
      强连通分量与缩点
      2-SAT 可满足性
      网络流与费用流
    动态规划 DP
      经典背包模型
      序列与线性 DP
      区间与环形 DP
      树形与换根 DP
      状态压缩 DP
      数位记忆化 DP
    数学与数论
      快速幂与线性筛
      组合数学与斯特林数
      概率期望与随机化算法
      线性代数与线性基
      博弈论与SG函数
    字符串算法
      KMP 与 Border 树
      Z 算法 ExKMP
      AC 自动机多模式匹配
      多项式双哈希
      后缀数组 SA
    计算几何专题
      几何基础与向量代数
      二维凸包与旋转卡壳
      几何扫描线与矩形面积
      极角排序与距离度量
    系统设计专题
      四步法与容量估算
      L4与L7负载均衡
      一致性哈希环
      缓存穿透击穿雪崩
      分库分表与LSM树
      消息队列与削峰
      雪花算法与分布式锁
      短链系统设计
      高并发限流器
      Feed流与时间线

📚 快速导航 (Quick Navigation)

1. 基础与通用工具 (Basic & Foundations)

模块 核心考点与理论 推荐代表真题
缺省源与常用宏 竞赛快速 I/O、现代 C++ 实用宏、本地调试器 —
算法面试 C++ 核心常识 STL 容器扩容/失效、自定义 Hash 与 unordered_set、严格弱序、递归 Lambda、SSO与 string_view、UB防御 —
算法复杂度与均摊分析 渐进记号、主定理 (Master Theorem)、均摊分析三大方法(聚合/记账/势能)、数据规模预期复杂度法则 —
计算复杂性理论 (P / NP / NPC / NP-Hard) 判定问题与最优化、P/NP定义(非确定机与多项式验证器)、Karp 多项式归约、Cook-Levin 定理、21个经典NPC、伪多项式时间与强弱NP-Hard、工程近似与启发式策略 —
二分与三分查找 整数与浮点二分、单峰函数三分、二分答案单调判定 LC 33, LC 34, LC 162, LC 410, LC 719, LC 2040
分治算法与主定理 主定理三类情形推导、归并排序求逆序对、平面最近点对 \(\mathcal{O}(n \log n)\) 鸽巢原理证明 LC 23, LC 315, LC 4, LC 240, LC 932
搜索算法与剪枝策略 回溯 DFS、六大剪枝(可行/最优/记忆/顺序/对称/估价)、双向 BFS 较小端扩展、A* 启发式搜索 LC 127, LC 126, LC 773, LC 752, LC 51, LC 37
常用排序与快速选择 快速排序三向切分、快速选择期望 \(\mathcal{O}(n)\)、置换环最小交换次数 LC 215, LC 75, LC 912, LC 765
MEX 理论与高阶维护 最小未出现值定义、值域桶统计、同余类贪心构造 LC 2598, LC 41, LC 2009
摩尔投票算法 绝对众数对消法、广义 \(k\) 候选人抵消、线段树结合 LC 169, LC 229, LC 1157, LC 961
Two Sum 与 K-Sum 变种 双指针、哈希表、折半查找 (Meet-in-the-Middle) LC 1, LC 15, LC 18, LC 167, LC 454
接雨水专题 一维三大解法(前后缀/双指针/单调栈)、二维最小堆收缩 LC 42, LC 407
括号序列专题 前缀和 Dyck 路径、卡特兰数、三大最长有效解法、线段树合并 LC 20, LC 22, LC 32, LC 678, LC 856

2. 贪心算法专题 (Greedy Algorithms)

模块 核心考点与理论 推荐代表真题
核心理论与证明范式 贪心选择性质、最优子结构、微扰法/邻项交换、保持前沿法、拟阵理论与自检四问 —
区间贪心与覆盖模型 不相交区间最大化、最少点覆盖、区间合并、区间完全覆盖、划分字母区间、区间分组 LC 435, LC 452, LC 56, LC 57, LC 763, LC 1024, LC 1326, LC 2406, LC 646
排序不等式与全序比较 排序不等式数学证明、微扰推导自定义比较器、拼接最大数传递性实数映射证明、降序插入、最大交换、Smith's Rule LC 179, LC 406, LC 621, LC 670, LC 767, LC 1005, LC 1405, LC 3273, LC 2136, LC 1665
序列推进与双向贪心 动态最远覆盖边界推进、分层 BFS 双指针跳跃、折线最低点法、左右规则解耦双向扫描、单调栈字符去重 LC 55, LC 45, LC 134, LC 135, LC 316, LC 402, LC 376, LC 738, LC 860
反悔贪心专题 (优先队列) “先选再说,遇优则换”撤销机制、截止时间约束作业调度、路过暂存备选缺油反悔补油、买卖股票反悔交易 LC 630, LC 871, LC 1353, LC 1642, LC 2434, LC 2813

3. 核心数据结构 (Data Structures)

模块 核心考点与理论 推荐代表真题
并查集 (DSU) 路径压缩与按秩合并、带权并查集、置换环与连通块 LC 200, LC 547, LC 684, LC 990, LC 827
树状数组 (BIT) lowbit 划分数学证明、\(\mathcal{O}(\log n)\) 二进制倍增找第 \(K\) 小、二维树状数组 LC 307, LC 315, LC 493, LC 1649, LC 2179
线段树 (Segment Tree) 延迟标记 (Lazy Tag)、动态开点、线段树上二分 LC 307, LC 218, LC 715, LC 2286
ST 表 (Sparse Table) 静态区间可重复贡献 RMQ 查询、\(\mathcal{O}(1)\) 区间最值、GCD 与按位与 LC 239, LC 3171, LC 2447, LC 1521
堆与优先队列 二叉堆实现、对顶堆动态中位数、反悔贪心、多路归并 LC 215, LC 295, LC 23, LC 1675, LC 632, LC 871
平衡二叉树 (AVL) 四种基本旋转 (LL/RR/LR/RL)、严格高度平衡、排名与邻域查询 LC 1382, LC 327, LC 220
红黑树 (Red-Black Tree) 黑色高度不变量、左倾红黑树 (LLRB)、GCC PBDS 库用法 —
无旋 Treap (FHQ-Treap) 基于分裂 (Split) 与合并 (Merge) 的区间翻转、名次树与中位数 LC 480, LC 218, LC 715

4. 图论核心算法 (Graph Theory)

模块 核心考点与理论 推荐代表真题
最短路算法 Dijkstra 堆优化、SPFA/Bellman-Ford 判负环、Floyd-Warshall、分层图 LC 743, LC 787, LC 1334, LC 1514, LC 1976
差分约束系统 不等式三角不等式图论映射、SPFA 判负环、超级源点、前缀和区间选点模型、DAG 偏序 LC 2589, LC 2392, LC 2050, LC 785
最小生成树 (MST) Kruskal 贪心、Prim 算法、超级源点、双图并查集与关键边判定 LC 1584, LC 1168, LC 1489, LC 1579
最近公共祖先 (LCA) 树上倍增法、树上点/边差分、LCA 路径分解 LC 236, LC 235, LC 1483, LC 1123, LC 2096
树的直径 (Tree Diameter) 两次 BFS/DFS 贪心证明、树形 DP 最长次长链、树的中心与若尔当定理、两树合并最小直径 LC 543, LC 124, LC 1245, LC 310, LC 3203
树链剖分 (HLD) 重链剖分将树上路径映射为 \(\mathcal{O}(\log n)\) 段 DFS 连续区间配合线段树 LC 236, LC 2421
拓扑排序 (Topological Sort) Kahn 算法入度队列、DAG 有向环判定、DAG 状态机路径 DP、双层分层拓扑 LC 207, LC 210, LC 269, LC 1857, LC 1203
欧拉路径与欧拉回路 Hierholzer 算法当前弧优化、有向/无向图度数守恒充要条件、De Bruijn 序列 LC 332, LC 753, LC 2097
哈密顿回路与旅行商问题 状压 DP 求解 TSP、集合位运算状态机、全遍历最短路 LC 847, LC 943, LC 980
割点与桥 (Tarjan) DFS 树回退边、dfn 与 low 数组判定定理、网格割点连通性 LC 1192, LC 1568, LC 924, LC 928
强连通分量 (Kosaraju) 正反图两次 DFS、缩点构建有向无环图 (DAG)、基环树环长讨论 LC 2360, LC 2127, LC 802
2-SAT 问题 析取向蕴涵图建模、Tarjan SCC 缩点判自相矛盾、逆拓扑序构造合法解、二分图染色退化关系 LC 785, LC 886, LC 1601, 洛谷 P4782
网络流 (Dinic) 残量网络、分层图 BFS + 阻塞流 DFS 当前弧优化、最大流最小割定理 LC 1349
费用流 (MCMF) 连续最短路 SPFA 与 Primal-Dual (Johnson 势能 + Dijkstra) —
二分图最大匹配 增广路定理、匈牙利算法、网格黑白染色骨牌覆盖与最大独立集 LC 1820, LCP 04, LC 1349

5. 动态规划专题 (Dynamic Programming)

模块 核心考点与理论 推荐代表真题
经典背包问题 0-1、完全、多重(二进制拆分/单调队列)、分组背包、二维费用与收益下界 LC 416, LC 494, LC 322, LC 518, LC 879, LC 1449
线性 DP 与序列模型 LIS(贪心二分)、LCS、编辑距离、Kadane 最大子数组、公差哈希与单调队列优化 LC 300, LC 354, LC 1143, LC 72, LC 188, LC 446, LC 1425
区间动态规划 长度 \(len\) 阶段递推、环形破环成链、戳气球逆向分治、区间染色与消除(蹭打印/外部升维)、四边形不等式优化 LC 312, LC 664, LC 546, LC 730, LC 1000
树形 DP 与换根 DP 树上最大独立集、树的直径、两次 DFS 换根 DP 范式、树上状态机与最小支配集 LC 337, LC 124, LC 834, LC 968, LC 310
状态压缩动态规划 集合位运算、子集遍历 sub = (sub - 1) & mask、两两匹配与子集背包划分 LC 847, LC 943, LC 698, LC 1655, LC 1799, LC 1986
数位记忆化 DP 前缀差分化简、工业级通用记忆化搜索模板 (is_limit / is_num) LC 2719, LC 233, LC 600, LC 2376, LC 902

6. 数学与数论 (Mathematics)

模块 核心考点与理论 推荐代表真题
数论基础 快速幂、扩展欧几里得 (exGCD)、线性求逆元、欧拉线性筛、LCM 二分与等差因数分解 LC 204, LC 372, LC 878, LC 829, LC 2523, LC 1015
组合数学 阶乘逆元组合数、卢卡斯定理 (Lucas)、第一类与第二类斯特林数、多重集合排列 LC 62, LC 1359, LC 920, LC 1866, LC 1643, LC 2514
概率论与期望 期望线性性、全概率公式、Fisher-Yates 原地洗牌、蓄水池抽样、概率期望与硬币背包 DP LC 688, LC 808, LC 837, LC 382, LC 1230, LC 398
线性代数与线性基 矩阵乘法、矩阵快速幂加速转移、高斯-约旦消元法求线性方程组、异或线性基维护 LC 509, LC 1137, LC 2851, LC 70
博弈论 (Game Theory) 公平组合游戏 (ICG)、P/N 局势推导、巴什博弈、威佐夫博弈、斐波那契博弈、尼姆博弈与 SG 定理 LC 292, LC 877, LC 1140, LC 913, LC 1406

7. 字符串算法 (String Algorithms)

模块 核心考点与理论 推荐代表真题
KMP 与前缀函数 前缀函数 \(\pi\) 数组、Border 树链、最小周期性引理、KMP 自动机、差分趋势匹配 LC 28, LC 459, LC 1392, LC 214, LC 686, LC 3036
Z 算法 (扩展 KMP) Z 函数线性匹配、前缀与后缀最长公共前缀 (LCP)、周期判定、最长回文前缀 LC 2223, LC 3031, LC 3045, LC 214
AC 自动机 (Aho-Corasick) 多模式串匹配、Trie 树、BFS Fail 指针失配跳转、Trie 图确定性转移优化、AC-DP 文本串安全匹配 LC 1032, LC 2781, LC 1408
字符串哈希 多项式滚动哈希、双哈希防 Hack 冲突设计、倒序滑动窗口模逆元规避、双哈希最长公共路径 LC 187, LC 1044, LC 1062, LC 2156, LC 1316, LC 1923
后缀数组 (SA) 倍增法与基数排序、Kasai 算法求高度数组 \(lcp\)、RMQ 快速 LCP 查询、不同子串计数公式 LC 1163, LC 1044, LC 1754, LC 1698, LC 1062

8. 计算几何 (Computational Geometry)

模块 核心考点与理论 推荐代表真题
几何基础与向量代数 浮点数 eps 防抖、点积(投影/正交/夹角)、叉积(有向面积/左右侧CCW)、线段相交快速排斥+跨立实验、点在多边形内射线法 LC 1232, LC 469, LC 223
二维凸包与旋转卡壳 Andrew 算法水平序单调栈、边界共线点处理技巧(叉积 < 0 与 used 标记)、旋转卡壳对踵点求凸包直径 LC 587
几何扫描线与矩形面积 事件驱动模型、X坐标离散化+垂直扫描线、线段树维护Y轴覆盖长度、完美矩形面积守恒与顶点异或消除 LC 850, LC 391
极角排序与距离度量 atan2 浮点排序与叉积象限精确排序、斜率有理数 \(\gcd\) 约分防溢出、曼哈顿与切比雪夫距离等价旋转变换、矩形对角线哈希 LC 149, LC 1610, LC 963, LC 1266

9. 系统设计专题 (System Design)

模块 核心考点与理论 推荐代表场景 / 工业实践
系统设计方法论与容量估算 四步面试法、QPS/带宽/存储/内存容量估算、必须牢记的延迟数字、CAP 定理、PACELC 模型、BASE 理论与一致性模型阶梯 大厂系统设计第一道门、容量规划
核心基础设施与分布式组件 L4/L7 负载均衡、一致性哈希与虚拟节点、Cache-Aside/Write-Through/Write-Back、缓存三大灾难防御、数据库分库分表、B+ Tree vs LSM-Tree、消息队列解耦与削峰、雪花算法 Snowflake、Redis 分布式锁 Redlock 分布式中间件选型、系统高可用改造
短链系统设计 (TinyURL) 读写比 100:1 容量规划、Base62 进制转换 vs 哈希截断防碰撞、HTTP 301 vs 302 重定向权衡、short_code 分片与多级缓存 TinyURL, Bitly, 营销短链
高并发限流器 (Rate Limiter) 五大限流算法(固定窗口/滑动日志/滑动计数器/令牌桶/漏桶)、Redis + Lua 脚本原子执行、HTTP 429 协议头标准、Fail-Open 容灾降级 API 网关防护、微服务防刷、开放平台
Feed 流与时间线系统 推模式 (Fan-out on write) vs 拉模式 (Fan-out on read) vs 混合推拉模式、大 V 粉丝写放大应对、Redis ZSet 收件箱设计、游标分页 (Cursor-based) 杜绝重复与深分页 Twitter, 微博, 微信朋友圈, Instagram

🎯 面试高效通关指引

为了帮助不同阶段的学习者快速定位重心,推荐按以下梯度进行专项攻坚:

  1. 第一阶段:基石掌握(面试必考)
  2. 熟练掌握双指针、二分查找、滑动窗口与哈希、栈与括号序列;
  3. 掌握单源最短路 Dijkstra 与 Kahn 拓扑排序;
  4. 掌握基础 0-1背包 与序列 线性 DP。
  5. 第二阶段:经典模型深化(周赛上分 / 中大厂高频)
  6. 并查集 的各种代数关系合并与置换环;
  7. 树形 DP 与全源换根 DP(如 LC 310, LC 834);
  8. 前后缀分解与接雨水 及不可逆操作的聚合维护;
  9. 数位 DP 记忆化模板,做到一遍过。
  10. 第三阶段:拔高与进阶(竞赛与 Hard 绝杀)
  11. 树状数组倍增二分 与 线段树动态合并;
  12. 树链剖分 HLD 与 Tarjan 割点与桥;
  13. 概率与期望 DP 及 状态压缩 DP。