补充算法类型分类
1. 字符串(String)
类型特点:字符串是字符的序列,常与双指针、滑动窗口、动态规划、KMP 等算法结合。题目通常涉及子串、回文、模式匹配等。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 简单 | 344. 反转字符串 | 双指针原地反转 |
| 简单 | 125. 验证回文串 | 双指针判断回文,忽略非字母数字 |
| 中等 | 5. 最长回文子串 | 中心扩展法或动态规划 |
| 中等 | 3. 无重复字符的最长子串 | 滑动窗口 + 哈希表 |
| 困难 | 10. 正则表达式匹配 | 动态规划,处理 '.' 和 '*' |
| 困难 | 72. 编辑距离 | 二维 DP,增删改操作 |
2. 回溯(Backtracking)
类型特点:回溯是深度优先搜索的一种形式,常用于解决排列、组合、子集、棋盘问题。核心是“做选择-递归-撤销选择”。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 中等 | 46. 全排列 | 回溯 + 标记已使用元素 |
| 中等 | 78. 子集 | 回溯,每个元素可选或不选 |
| 中等 | 39. 组合总和 | 回溯 + 剪枝,允许重复选取 |
| 中等 | 79. 单词搜索 | 回溯在二维网格中搜索单词 |
| 困难 | 51. N 皇后 | 回溯,列、对角线冲突判断 |
| 困难 | 37. 解数独 | 回溯 + 状态压缩优化 |
3. 动态规划专题(DP)
类型特点:动态规划适用于具有重叠子问题和最优子结构的问题。除了基础的线性 DP,还有区间 DP、树形 DP、状态压缩 DP、数位 DP 等。虽然数组中已涉及部分,但这里单独列出更全面的 DP 题目。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 简单 | 70. 爬楼梯 | 斐波那契式 DP |
| 中等 | 198. 打家劫舍 | 线性 DP,相邻不能偷 |
| 中等 | 300. 最长递增子序列 | 二分优化或 O(n²) DP |
| 中等 | 1143. 最长公共子序列 | 二维 DP,字符匹配 |
| 困难 | 887. 鸡蛋掉落 | 经典 DP 优化 |
| 困难 | 312. 戳气球 | 区间 DP,反向思考 |
4. 位运算(Bit Manipulation)
类型特点:利用整数的二进制表示进行高效操作,常用于状态压缩、异或性质、位掩码等。位运算通常能将时间复杂度降为 O(n) 或更低。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 简单 | 136. 只出现一次的数字 | 异或运算,相同数抵消 |
| 简单 | 191. 位1的个数 | n & (n-1) 消除最低位的 1 |
| 中等 | 78. 子集 | 位掩码枚举所有子集 |
| 中等 | 201. 数字范围按位与 | 寻找公共前缀 |
| 困难 | 260. 只出现一次的数字 III | 分组异或 |
5. 数学(Math)
类型特点:涉及数学定理、公式推导、几何计算等。常见有素数判断、最大公约数、快速幂、几何计算等。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 简单 | 9. 回文数 | 反转一半数字比较 |
| 简单 | 204. 计数质数 | 埃氏筛法 |
| 中等 | 50. Pow(x, n) | 快速幂(二分递归) |
| 中等 | 166. 分数到小数 | 模拟除法,处理循环节 |
| 困难 | 149. 直线上最多的点数 | 斜率哈希,注意精度 |
6. 排序(Sorting)
类型特点:掌握各种排序算法的实现(快速、归并、堆排)以及基于排序的变形问题(如桶排序、基数排序)。排序本身常作为其他算法的基础。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 中等 | 148. 排序链表 | 归并排序在链表上的实现 |
| 中等 | 179. 最大数 | 自定义排序规则 |
| 中等 | 912. 排序数组 | 手撕快速排序或归并排序 |
| 困难 | 164. 最大间距 | 桶排序思想 |
7. 分治(Divide and Conquer)
类型特点:将问题分解为若干个规模较小但类似的子问题,递归解决后合并结果。典型应用有归并排序、快速排序、最近点对等。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 中等 | 53. 最大子数组和 | 分治(也可 DP) |
| 中等 | 169. 多数元素 | 分治或摩尔投票 |
| 困难 | 23. 合并K个升序链表 | 分治法合并(也可用堆) |
| 困难 | 241. 为运算表达式设计优先级 | 分治加括号 |
8. 设计(Design)
类型特点:要求实现特定功能的数据结构或系统,通常需要综合运用多种基础数据结构。常见题如 LRU、LFU、线程安全等。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 中等 | 146. LRU 缓存 | 哈希表 + 双向链表 |
| 中等 | 380. O(1) 时间插入、删除和获取随机元素 | 哈希表 + 动态数组 |
| 困难 | 460. LFU 缓存 | 哈希表 + 双向链表 + 频率索引 |
| 中等 | 155. 最小栈 | 辅助栈 |
9. 多线程(Concurrency)
类型特点:涉及并发控制、锁、信号量等,题目较少,但有时出现在面试中。力扣上有专门的“多线程”标签。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 中等 | 1114. 按序打印 | 控制线程执行顺序 |
| 中等 | 1115. 交替打印 FooBar | 信号量或锁 |
| 中等 | 1116. 打印零与奇偶数 | 三个线程交替打印 |
10. 高级数据结构(Segment Tree / Fenwick Tree / Balanced Tree)
类型特点:用于处理区间查询、区间更新等问题。线段树和树状数组常用于解决逆序对、区间和、区间最值等。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 困难 | 307. 区域和检索 - 数组可修改 | 树状数组或线段树 |
| 困难 | 315. 计算右侧小于当前元素的个数 | 树状数组(离散化) |
| 困难 | 218. 天际线问题 | 扫描线 + 线段树(或优先队列) |
| 困难 | 493. 翻转对 | 归并排序或树状数组 |
总结
以上十类算法是面试和竞赛中除之前已列类型外的高频考点。建议按以下顺序拓展练习:
- 字符串 + 回溯(打好基础)
- 动态规划专题(分类型练习)
- 位运算 + 数学(锻炼思维)
- 排序 + 分治(理解递归思想)
- 设计 + 高级数据结构(提升综合能力)
- 多线程(若时间允许)