算法面试题型 MOC
算法面试题型分类地图,从识别题型到选择策略的完整速查。
#type / moc
#status / growing
#resource / algorithm
#resource / interview
算法面试题型 MOC
[!tip] 学习心态 面试算法题是应试型技能,目标是:
- 看到题能快速识别题型
- 有限时间内给出正确、清晰、可解释的解法
- 能把思路讲出来
- 代码写得稳,边界处理不炸
- 能从 brute force 一步步优化到更优解
一、基础数据结构
数组与字符串
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 双指针 | 有序数组、两数之和、去重 | 对撞/快慢指针压缩搜索空间 | 两数之和, 两数之和2, 三数之和, 盛最多水的容器, 接雨水, 移动零 |
| 滑动窗口 | 连续子数组/子串、最长/最短 | 维护窗口边界,O(n) 遍历 | 滑动窗口, 无重复字符的最长子串, 滑动窗口最大值, 和为k的子数组, 字母异位词分组, 删除字符串中的所有相邻重复项 |
| 前缀和 | 区间和、连续子数组和 | 预处理前缀数组,O(1) 查询 | 前缀和, 和为k的子数组 |
| 二分查找 | 有序、搜索边界、最小/最大 | 缩小搜索区间,注意边界 | 二分查找, 搜索插入位置, 搜索旋转排序数组, 寻找旋转排序数组中的最小值, 在排序数组中查找元素的第一个和最后一个位置, 搜索二维矩阵, 最小除数, 分割数组的最大值 |
| 排序 | 排序后处理、自定义排序 | 先排序再贪心/双指针 | 排序算法总结, 快速排序, 基数排序, 随机选择, Fisher-Yates 洗牌, 合并区间, 无重叠区间 |
链表
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 快慢指针 | 环检测、中点、倒数第K | 快指针走两步,慢指针走一步 | 链表面试模式, 寻找重复数 |
| 反转链表 | 反转、部分反转 | 三指针迭代或递归 | 链表面试模式 |
| 合并链表 | 两个有序链表合并 | 归并思想 | 合并K个升序链表 |
| 虚拟头节点 | 删除节点、合并 | 统一处理头节点 | |
| 链表与二叉树 | 链表转二叉树、回溯 | 链表结构与树结构互转 | 链表与二叉树回溯 |
栈与队列
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 单调栈 | 下一个更大元素、柱状图 | 维护递增/递减栈 | 单调栈, 每日温度, 柱状图中最大的矩形, 小行星碰撞 |
| 单调队列 | 滑动窗口最大值 | 维护递减队列 | 单调队列, 滑动窗口最大值 |
| 有效括号 | 匹配、嵌套 | 左括号入栈,右括号匹配 | 栈, 有效括号, 最长有效括号, 基本计算器 |
| 最小栈 | O(1) 获取最小值 | 辅助栈同步记录 | 最小栈 |
| 栈与队列互实现 | 用栈实现队列、用队列实现栈 | 数据结构转换 | 用栈实现队列, 用队列实现栈 |
| 栈的应用 | 逆波兰表达式、就地操作 | 栈的工程应用 | 逆波兰表达式求值, 原地栈 |
哈希表
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 两数之和 | 查找、配对 | 哈希表存已遍历值 | 哈希表与有序映射, 两数之和, 两数之和2 |
| 字符串统计 | 字符频率、异位词 | 哈希表计数 | 字母异位词分组 |
| 前缀 + 哈希 | 连续子数组和为K | 前缀和 + 哈希表 | 和为k的子数组 |
堆(优先队列)
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| Top K | 第K大/小 | 大小根堆 | 堆与堆排序, 有序矩阵中第K小的元素 |
| 合并K个有序 | 多路归并 | 小根堆 | 合并K个升序链表 |
| 中位数 | 数据流中位数 | 对顶堆 | 堆面试问题 |
| 堆的应用 | 最大重叠区间、数组操作 | 堆在工程问题中的运用 | 最大重叠区间堆, 数组求和减半, 使列严格递增的最少操作 |
二、树与图
二叉树
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 遍历 | 前/中/后/层序 | 递归或迭代(栈/队列) | 二叉树基础, 二叉树层序遍历, 二叉树锯齿形层序遍历 |
| 深度/高度 | 最大深度、最小深度 | DFS 递归 | 二叉树的最大深度, 二叉树的最小深度 |
| 路径问题 | 路径和、所有路径 | DFS + 回溯 | 二叉树高频题, 路径总和, 二叉树最长交错路径 |
| LCA | 最近公共祖先 | 后序遍历 | 二叉树的最近公共祖先 |
| 序列化 | 二叉树转字符串 | 前序/层序 | 二叉树前序序列化, 二叉树层序序列化 |
| 构建树 | 前序+中序还原 | 递归分割 | 从前序与中序遍历序列构造二叉树 |
| 对称/相同 | 镜像、相同树 | 递归比较 | 对称二叉树, 相同的树 |
| 树的属性 | 翻转、好节点、宽度、节点计数 | 树的结构与属性问题 | 翻转二叉树, 统计二叉树中好节点的数目, 二叉树最大宽度, 完全二叉树的节点个数, 验证完全二叉树 |
BST(二叉搜索树)
| 题型 | 关键词 | 核心思路 |
|---|---|---|
| 验证 BST | 有序性 | 中序遍历 or 递归上下界 |
| 查找/插入/删除 | BST 操作 | 利用有序性递归/迭代 |
| 第K小 | 有序性 | 中序遍历计数 |
图
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| DFS/BFS 遍历 | 连通分量、岛屿 | 标记已访问 + 递归/队列 | DFS/BFS/回溯 |
| 拓扑排序 | 课程表、依赖关系 | BFS(入度表)或 DFS | |
| 最短路径 | 无权图最短路径 | BFS | |
| 并查集 | 连通性、合并集合 | 路径压缩 + 按秩合并 |
三、动态规划
[!info] DP 核心
- 找状态:明确
dp[i]或dp[i][j]代表什么- 找选择:每个状态由哪些子状态转移而来
- 找 base case:最小子问题的答案
线性 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 爬楼梯 | 70. Climbing Stairs | 线性DP, 爬楼梯, 斐波那契数列 |
| 打家劫舍 | 198. House Robber | 线性DP, 打家劫舍, 打家劫舍II, 打家劫舍III |
| 最长递增子序列 | 300. LIS | 线性DP, 最长递增子序列 |
| 最长公共子序列 | 1143. LCS | LCS模板, 最长公共子序列 |
| 编辑距离 | 72. Edit Distance | 编辑距离模板, 编辑距离 |
| 不同子序列 | 115. Distinct Subsequences | 线性DP, 不同的子序列 |
背包 DP
| 类型 | 特点 | 深入 |
|---|---|---|
| 01 背包 | 每件物品选一次 | 01背包模板, 分割等和子集, 目标和 |
| 完全背包 | 每件物品无限选 | 完全背包模板, 零钱兑换, 零钱兑换II |
| 多重背包 | 每件物品有限选 | 背包DP |
区间 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 戳气球 | 312. Burst Balloons | 区间与状态机DP, 戳气球 |
| 最长回文子串 | 5. Longest Palindromic Substring | 区间与状态机DP, 最长回文子串, 最长回文子序列 |
| 石子合并 | 区间合并 | 区间与状态机DP |
网格 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 不同路径 | 62. Unique Paths | 网格与序列DP, 不同路径 |
| 最小路径和 | 64. Minimum Path Sum | 网格与序列DP, 最小路径和 |
| 矩阵中的路径 | 搜索 + DP | 网格与序列DP |
树形 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 打家劫舍 III | 337. House Robber III | 树形DP, 打家劫舍III |
| 二叉树直径 | 543. Diameter of Binary Tree | 树形DP |
状态机 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 买卖股票 | 121/122/123/188/309/714 | 区间与状态机DP, 买卖股票的最佳时机, 买卖股票的最佳时机IV, 最佳买卖股票时机含冷冻期, 买卖股票的最佳时机含手续费, 股票交易面试题 |
数位 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 数字1的个数 | 233. Number of Digit One | 数位DP |
概率 DP
| 题型 | 经典题 | 深入 |
|---|---|---|
| 掷骰子概率 | 概率计算 | 概率DP |
四、搜索与回溯
DFS / BFS
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 岛屿问题 | 连通区域、染色 | DFS/BFS 遍历标记 | DFS/BFS/回溯 |
| 走迷宫 | 最短路径、可达性 | BFS 层序遍历 | DFS/BFS/回溯 |
| 单词搜索 | 网格搜索 | DFS + 回溯 | DFS/BFS/回溯 |
回溯
| 题型 | 关键词 | 模板要点 | 深入 |
|---|---|---|---|
| 全排列 | 排列、顺序有关 | used 数组标记 | 全排列回溯模板 |
| 组合 | 组合、顺序无关 | start 参数去重 | 回溯算法, 电话号码的字母组合 |
| 子集 | 所有子集 | 每个位置选/不选 | 回溯算法 |
| N 皇后 | 棋盘、约束 | 列/对角线标记 | 回溯算法 |
| 数独 | 约束填充 | 逐格尝试 | 回溯算法 |
递归
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 分治 | 大问题拆小问题 | 递归 + 合并结果 | 递归算法 |
| 汉诺塔 | 经典递归 | 三步分解 | 递归算法 |
五、贪心算法
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 区间调度 | 不重叠区间、最少删除 | 按结束时间排序 | 贪心算法, 无重叠区间 |
| 跳跃游戏 | 最远可达 | 维护最远边界 | 贪心算法 |
| 分发糖果 | 相邻约束 | 两次遍历 | 贪心算法 |
| 加油站 | 环形遍历 | 累积剩余油量 | 贪心算法 |
| 贪心其他 | 最少魔法豆、买苹果折扣 | 排序后贪心 | 移除魔法豆, 买糖果折扣, 重新分配苹果 |
六、位运算
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 只出现一次的数 | 异或性质 | a ^ a = 0 | 异或与位运算技巧 |
| 2的幂 | 位判断 | n & (n-1) == 0 | 位运算 |
| 位计数 | 1的个数 | n & (n-1) 消最低位1 | 位运算 |
| 子集枚举 | 位掩码 | 二进制表示选/不选 | 位图与位集 |
七、数学与模拟
| 题型 | 关键词 | 核心思路 |
|---|---|---|
| 快速幂 | 幂运算 | 二进制分解指数 |
| 最大公约数 | GCD/LCM | 辗转相除法 |
| 质数判断 | 素数 | 试除法 / 埃氏筛 |
| 进制转换 | 进制 | 除基取余 |
| 日期计算 | 日历 | 模拟或公式 |
八、字符串专项
| 题型 | 关键词 | 核心思路 |
|---|---|---|
| KMP | 模式匹配 | 构建 next 数组 |
| 最长回文子串 | 中心扩展 / Manacher | 中心扩散或线性算法 |
| 字符串哈希 | 快速比较子串 | 预处理哈希值 |
| 正则匹配 | 模式匹配 | DP 或递归 |
题型识别速查表
[!tip] 看到这些关键词,想到这些方法
| 关键词 | 优先考虑 |
|---|---|
| 有序数组 | 二分查找、双指针 |
| 连续子数组/子串 | 滑动窗口、前缀和 |
| 第K大/小 | 堆(优先队列)、快速选择 |
| 配对/两数 | 哈希表、排序+双指针 |
| 所有方案/排列组合 | 回溯 |
| 最优值/最少/最多 | 动态规划、贪心 |
| 连通/岛屿/区域 | DFS/BFS、并查集 |
| 下一个更大/更小 | 单调栈 |
| 滑动窗口最值 | 单调队列 |
| 环检测/中点 | 快慢指针 |
| 对称/匹配/嵌套 | 栈 |
| 区间合并/重叠 | 排序 + 贪心 |
| 树的路径/深度 | DFS 递归 |
| 依赖关系/先后顺序 | 拓扑排序 |
| 状态转移 | 动态规划 |
| 选/不选 | 01背包、回溯 |
| 无限选 | 完全背包 |
解题步骤模板
1. 读题 → 识别关键词 → 判断题型
2. 想暴力解 → 确定时间复杂度
3. 思考优化方向
- 能否用空间换时间?→ 哈希表/DP
- 能否减少重复计算?→ 记忆化/DP
- 能否利用有序性?→ 排序/二分
- 能否缩小搜索空间?→ 贪心/剪枝
4. 写代码 → 注意边界 → 自测用例
5. 复杂度分析 → 能口述
九、密码学与加密算法
[!info] 密码学与数学基础 这一组覆盖古典密码、对称加密、非对称加密和相关数学基础。
对称加密
| 题型 | 关键词 | 深入 |
|---|---|---|
| DES | 数据加密标准 | DES 数据加密标准 |
| 3DES | 三重 DES | 3DES |
| ECB 模式 | 电子密码本 | ECB 模式 |
| CBC 模式 | 密码分组链接 | CBC 模式 |
| CFB 模式 | 密码反馈 | CFB 模式 |
非对称加密
| 题型 | 关键词 | 深入 |
|---|---|---|
| RSA | 公钥加密 | RSA 算法 |
古典密码
| 题型 | 关键词 | 深入 |
|---|---|---|
| 仿射密码 | 线性变换 | 仿射密码 |
密码学数学基础
| 题型 | 关键词 | 深入 |
|---|---|---|
| 模逆元 | 模运算、逆元素 | 模逆元 |
| 欧拉函数 | 数论、互质 | 欧拉函数 |
十、数据结构设计与综合题
| 题型 | 关键词 | 核心思路 | 深入 |
|---|---|---|---|
| 数据结构设计 | 组合数据结构 | 设计满足特定操作的数据结构 | 数据结构设计面试 |
| AVL 树 | 自平衡二叉搜索树 | 旋转维持平衡 | AVL树 |
| 分治法 | 大问题拆小 | 递归分解 + 合并 | 分治法 |
| 数组轮转 | 旋转数组 | 三次翻转或环状替换 | 轮转数组 |
| 最长连续序列 | 哈希集合 | O(n) 查找连续序列 | 最长连续序列 |
| 数组操作 | 移动零、最小操作 | 双指针或数学推导 | 移动零, 使数组全零的最少操作 |
学习资源与面试
- 如何学习算法面试 - 如何学习算法面试
- LeetCode - LeetCode 刷题记录
- 牛客 - 牛客刷题记录
- 美团前端算法题 - 美团前端算法题
- 百度好题 - 百度好题
- 惩罚数 - 惩罚数
- 二叉树最大宽度 - 二叉树最大宽度
- 最小除数 - 最小除数
- 最大可获得分数 - 最大可获得分数
- 小和问题 - 小和问题(归并排序应用)
- 股票交易面试题 - 股票交易面试题
延伸阅读
相关地图
- 计算机基础面试 - 计算机基础面试
- 学科知识 MOC - 学科知识 MOC
- JavaScript MOC - JavaScript MOC
- 安全 MOC - 安全 MOC