算法面试题型 MOC
算法面试题型分类地图,从识别题型到选择策略的完整速查。
#type / moc
#status / growing
#resource / algorithm
#resource / interview
算法面试题型 MOC
[!tip] 学习心态 面试算法题是应试型技能,目标是:
- 看到题能快速识别题型
- 有限时间内给出正确、清晰、可解释的解法
- 能把思路讲出来
- 代码写得稳,边界处理不炸
- 能从 brute force 一步步优化到更优解
一、基础数据结构
数组与字符串
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 双指针 | 有序数组、两数之和、去重 | 对撞/快慢指针压缩搜索空间 | two-sum, 两数之和2, 三数之和, 盛最多水的容器, 接雨水, move-zeroes |
| 滑动窗口 | 连续子数组/子串、最长/最短 | 维护窗口边界,O(n) 遍历 | sliding-window, longest-substring-without-repeating, 滑动窗口最大值, max-vowels-in-fixed-length-substring, 和为k的子数组, minimum-operations-to-reduce-x-to-zero, 字母异位词分组, remove-all-adjacent-duplicates-in-string |
| 前缀和 | 区间和、连续子数组和 | 预处理前缀数组,O(1) 查询 | prefix-sum, 和为k的子数组 |
| 二分查找 | 有序、搜索边界、最小/最大 | 缩小搜索区间,注意边界 | binary-search-algorithm, search-insert-position, search-in-rotated-sorted-array, find-minimum-in-rotated-sorted-array, find-first-and-last-position-of-element-in-sorted-array, search-a-2d-matrix, smallest-divisor-given-threshold, split-array-largest-sum |
| 排序 | 排序后处理、自定义排序 | 先排序再贪心/双指针 | sorting-algorithms-summary, quicksort, radix-sort, randomized-select, fisher-yates-shuffle, 合并区间, non-overlapping-intervals |
链表
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 快慢指针 | 环检测、中点、倒数第K | 快指针走两步,慢指针走一步 | linked-list-interview-patterns, find-the-duplicate-number |
| 反转链表 | 反转、部分反转 | 三指针迭代或递归 | linked-list-interview-patterns |
| 合并链表 | 两个有序链表合并 | 归并思想 | merge-k-sorted-lists-heap |
| 虚拟头节点 | 删除节点、合并 | 统一处理头节点 | |
| 链表与二叉树 | 链表转二叉树、回溯 | 链表结构与树结构互转 | linked-list-binary-tree-backtracking |
栈与队列
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 单调栈 | 下一个更大元素、柱状图 | 维护递增/递减栈 | monotonic-stack, daily-temperatures, largest-rectangle-in-histogram, asteroid-collision |
| 单调队列 | 滑动窗口最大值 | 维护递减队列 | monotonic-queue, 滑动窗口最大值 |
| 有效括号 | 匹配、嵌套 | 左括号入栈,右括号匹配 | stack, valid-parentheses, longest-valid-parentheses, basic-calculator |
| 最小栈 | O(1) 获取最小值 | 辅助栈同步记录 | min-stack |
| 栈与队列互实现 | 用栈实现队列、用队列实现栈 | 数据结构转换 | implement-queue-using-stacks, implement-stack-using-queues |
| 栈的应用 | 逆波兰表达式、就地操作 | 栈的工程应用 | evaluate-reverse-polish-notation, in-place-stack |
哈希表
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 两数之和 | 查找、配对 | 哈希表存已遍历值 | hash-table-and-ordered-map, two-sum, 两数之和2 |
| 字符串统计 | 字符频率、异位词 | 哈希表计数 | 字母异位词分组 |
| 前缀 + 哈希 | 连续子数组和为K | 前缀和 + 哈希表 | 和为k的子数组 |
堆(优先队列)
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| Top K | 第K大/小 | 大小根堆 | heap-and-heap-sort, kth-smallest-element-in-a-sorted-matrix |
| 合并K个有序 | 多路归并 | 小根堆 | merge-k-sorted-lists-heap |
| 中位数 | 数据流中位数 | 对顶堆 | heap-interview-problems |
| 堆的应用 | 最大重叠区间、数组操作 | 堆在工程问题中的运用 | max-overlapping-segments-heap, halve-array-sum-max-heap, min-operations-to-make-columns-strictly-increasing |
二、树与图
二叉树
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 遍历 | 前/中/后/层序 | 递归或迭代(栈/队列) | binary-tree-basics, binary-tree-level-order-traversal, binary-tree-zigzag-level-order-traversal |
| 深度/高度 | 最大深度、最小深度 | DFS 递归 | max-depth-of-binary-tree, minimum-depth-of-binary-tree |
| 路径问题 | 路径和、所有路径 | DFS + 回溯 | binary-tree-high-frequency, path-sum, longest-zigzag-path-in-binary-tree |
| LCA | 最近公共祖先 | 后序遍历 | lowest-common-ancestor-binary-tree |
| 序列化 | 二叉树转字符串 | 前序/层序 | binary-tree-serialization-preorder, binary-tree-serialization-level-order |
| 构建树 | 前序+中序还原 | 递归分割 | construct-binary-tree-from-preorder-and-inorder |
| 对称/相同 | 镜像、相同树 | 递归比较 | symmetric-tree, same-tree |
| 树的属性 | 翻转、好节点、宽度、节点计数 | 树的结构与属性问题 | invert-binary-tree, count-good-nodes-in-binary-tree, maximum-width-of-binary-tree, count-complete-tree-nodes, validate-complete-binary-tree |
BST(二叉搜索树)
| 题型 | 关键词 | 核心思路 |
|---|---|---|
| 验证 BST | 有序性 | 中序遍历 or 递归上下界 |
| 查找/插入/删除 | BST 操作 | 利用有序性递归/迭代 |
| 第K小 | 有序性 | 中序遍历计数 |
图
| 题型 | 关键词 | 核心思路 |
|---|---|---|
| DFS/BFS 遍历 | 连通分量、岛屿 | 标记已访问 + 递归/队列 |
| 拓扑排序 | 课程表、依赖关系 | BFS(入度表)或 DFS |
| 最短路径 | 无权图最短路径 | BFS |
| 并查集 | 连通性、合并集合 | 路径压缩 + 按秩合并 |
三、动态规划
[!info] DP 核心
- 找状态:明确
dp[i]或dp[i][j]代表什么- 找选择:每个状态由哪些子状态转移而来
- 找 base case:最小子问题的答案
线性 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 爬楼梯 | 70. Climbing Stairs | dp-linear-dp, climbing-stairs, fibonacci |
| 打家劫舍 | 198. House Robber | dp-linear-dp, house-robber, house-robber-ii, house-robber-iii |
| 最长递增子序列 | 300. LIS | dp-linear-dp, longest-increasing-subsequence |
| 最长公共子序列 | 1143. LCS | dp-template-lcs, longest-common-subsequence |
| 编辑距离 | 72. Edit Distance | dp-template-edit-distance, edit-distance |
| 不同子序列 | 115. Distinct Subsequences | dp-linear-dp, distinct-subsequences |
背包 DP
| 类型 | 特点 | 深入 |
|---|---|---|
| 01 背包 | 每件物品选一次 | dp-template-01-knapsack, partition-equal-subset-sum, target-sum |
| 完全背包 | 每件物品无限选 | dp-template-complete-knapsack, coin-change, coin-change-ii |
| 多重背包 | 每件物品有限选 | dp-knapsack |
区间 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 戳气球 | 312. Burst Balloons | dp-interval-and-state-machine, burst-balloons |
| 最长回文子串 | 5. Longest Palindromic Substring | dp-interval-and-state-machine, longest-palindromic-substring, longest-palindromic-subsequence |
| 石子合并 | 区间合并 | dp-interval-and-state-machine |
网格 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 不同路径 | 62. Unique Paths | dp-grid-and-sequence, unique-paths |
| 最小路径和 | 64. Minimum Path Sum | dp-grid-and-sequence, minimum-path-sum |
| 矩阵中的路径 | 搜索 + DP | dp-grid-and-sequence |
树形 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 打家劫舍 III | 337. House Robber III | dp-tree-dp, house-robber-iii |
| 二叉树直径 | 543. Diameter of Binary Tree | dp-tree-dp |
状态机 DP
数位 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 数字1的个数 | 233. Number of Digit One | dp-digit-dp |
概率 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 掷骰子概率 | 概率计算 | dp-probability-dp |
四、搜索与回溯
DFS / BFS
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 岛屿问题 | 连通区域、染色 | DFS/BFS 遍历标记 | dfs-bfs-backtracking |
| 走迷宫 | 最短路径、可达性 | BFS 层序遍历 | dfs-bfs-backtracking |
| 单词搜索 | 网格搜索 | DFS + 回溯 | dfs-bfs-backtracking |
回溯
| 题型 | 关键词 | 模板要点 | 深入 |
|---|---|---|---|
| 全排列 | 排列、顺序有关 | used 数组标记 | permutations-backtracking-template |
| 组合 | 组合、顺序无关 | start 参数去重 | backtracking-algorithm, letter-combinations-of-phone-number |
| 子集 | 所有子集 | 每个位置选/不选 | backtracking-algorithm |
| N 皇后 | 棋盘、约束 | 列/对角线标记 | backtracking-algorithm |
| 数独 | 约束填充 | 逐格尝试 | backtracking-algorithm |
递归
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 分治 | 大问题拆小问题 | 递归 + 合并结果 | recursion-algorithm |
| 汉诺塔 | 经典递归 | 三步分解 | recursion-algorithm |
五、贪心算法
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 区间调度 | 不重叠区间、最少删除 | 按结束时间排序 | greedy-algorithm, non-overlapping-intervals |
| 跳跃游戏 | 最远可达 | 维护最远边界 | greedy-algorithm |
| 分发糖果 | 相邻约束 | 两次遍历 | greedy-algorithm |
| 加油站 | 环形遍历 | 累积剩余油量 | greedy-algorithm |
| 贪心其他 | 最少魔法豆、买苹果折扣 | 排序后贪心 | removing-minimum-magic-beans, minimum-cost-buying-candies-with-discount, redistribute-apples |
六、位运算
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 只出现一次的数 | 异或性质 | a ^ a = 0 | xor-and-bit-tricks |
| 2的幂 | 位判断 | n & (n-1) == 0 | bitwise-arithmetic |
| 位计数 | 1的个数 | n & (n-1) 消最低位1 | bitwise-arithmetic |
| 子集枚举 | 位掩码 | 二进制表示选/不选 | bitmap-bitset |
七、数学与模拟
| 题型 | 关键词 | 核心思路 |
|---|---|---|
| 快速幂 | 幂运算 | 二进制分解指数 |
| 最大公约数 | GCD/LCM | 辗转相除法 |
| 质数判断 | 素数 | 试除法 / 埃氏筛 |
| 进制转换 | 进制 | 除基取余 |
| 日期计算 | 日历 | 模拟或公式 |
八、字符串专项
| 题型 | 关键词 | 核心思路 |
|---|---|---|
| KMP | 模式匹配 | 构建 next 数组 |
| 最长回文子串 | 中心扩展 / Manacher | 中心扩散或线性算法 |
| 字符串哈希 | 快速比较子串 | 预处理哈希值 |
| 正则匹配 | 模式匹配 | DP 或递归 |
题型识别速查表
[!tip] 看到这些关键词,想到这些方法
| 关键词 | 优先考虑 |
|---|---|
| 有序数组 | 二分查找、双指针 |
| 连续子数组/子串 | 滑动窗口、前缀和 |
| 第K大/小 | 堆(优先队列)、快速选择 |
| 配对/两数 | 哈希表、排序+双指针 |
| 所有方案/排列组合 | 回溯 |
| 最优值/最少/最多 | 动态规划、贪心 |
| 连通/岛屿/区域 | DFS/BFS、并查集 |
| 下一个更大/更小 | 单调栈 |
| 滑动窗口最值 | 单调队列 |
| 环检测/中点 | 快慢指针 |
| 对称/匹配/嵌套 | 栈 |
| 区间合并/重叠 | 排序 + 贪心 |
| 树的路径/深度 | DFS 递归 |
| 依赖关系/先后顺序 | 拓扑排序 |
| 状态转移 | 动态规划 |
| 选/不选 | 01背包、回溯 |
| 无限选 | 完全背包 |
解题步骤模板
1. 读题 → 识别关键词 → 判断题型
2. 想暴力解 → 确定时间复杂度
3. 思考优化方向
- 能否用空间换时间?→ 哈希表/DP
- 能否减少重复计算?→ 记忆化/DP
- 能否利用有序性?→ 排序/二分
- 能否缩小搜索空间?→ 贪心/剪枝
4. 写代码 → 注意边界 → 自测用例
5. 复杂度分析 → 能口述
九、密码学与加密算法
[!info] 密码学与数学基础 这一组覆盖古典密码、对称加密、非对称加密和相关数学基础。
对称加密
| 题型 | 关键词 | 深入 |
|---|---|---|
| DES | 数据加密标准 | data-encryption-standard-des |
| 3DES | 三重 DES | 3-des |
| ECB 模式 | 电子密码本 | ecb-electronic-codebook-mode |
| CBC 模式 | 密码分组链接 | cipher-block-chaining-cbc |
| CFB 模式 | 密码反馈 | cipher-feedback-mode-cfb |
非对称加密
| 题型 | 关键词 | 深入 |
|---|---|---|
| RSA | 公钥加密 | rsa |
古典密码
| 题型 | 关键词 | 深入 |
|---|---|---|
| 仿射密码 | 线性变换 | affine-cipher |
密码学数学基础
| 题型 | 关键词 | 深入 |
|---|---|---|
| 模逆元 | 模运算、逆元素 | modular-inverse |
| 欧拉函数 | 数论、互质 | euler-totient-function |
十、数据结构设计与综合题
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 数据结构设计 | 组合数据结构 | 设计满足特定操作的数据结构 | data-structure-design-interview |
| AVL 树 | 自平衡二叉搜索树 | 旋转维持平衡 | avl-tree |
| 分治法 | 大问题拆小 | 递归分解 + 合并 | divide-and-conquer |
| 数组轮转 | 旋转数组 | 三次翻转或环状替换 | 轮转数组 |
| 最长连续序列 | 哈希集合 | O(n) 查找连续序列 | 最长连续序列 |
| 数组操作 | 移动零、最小操作 | 双指针或数学推导 | move-zeroes, minimum-operations-to-make-all-zero |
学习资源与面试
- how-to-learn-algorithm-for-interview - 如何学习算法面试
- leetcode - LeetCode 刷题记录
- 牛客 - 牛客刷题记录
- meituan-frontend-algorithm-quiz-1 - 美团前端算法题
- baidu-good-array-ceil-floor-difference - 百度好题
- find-punishment-number-of-integer - 惩罚数
- maximum-width-of-binary-tree - 二叉树最大宽度
- smallest-divisor-given-threshold - 最小除数
- max-points-obtainable - 最大可获得分数
- small-sum-problem - 小和问题(归并排序应用)
- interview-max-asset-stock-trading - 股票交易面试题
延伸阅读
- 排序算法总结:sorting-algorithms-summary
- 二分查找:binary-search-algorithm
- 滑动窗口:sliding-window
- 回溯算法:backtracking-algorithm
- DP 入门:dp-linear-dp
- 动态规划总览:dynamic-programming
相关地图
- interview-cs-fundamentals-moc - 计算机基础面试
- academic-knowledge-moc - 学科知识 MOC
- javascript-moc - JavaScript MOC
- security-moc - 安全 MOC