堆 / 优先队列
共 25 条分类条目,6 个题型小节; 每行标注难度、题号、原笔记摘要和 LeetCode 链接。
二、Top K 问题(最经典)
6 条类型特点:求前 K 大通常用小顶堆(堆顶是门槛,只有比门槛大的才进来),求前 K 小通常用大顶堆。维护一个大小为 K 的堆,遍历一次即可 。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 中等 | 215. 数组中的第K个最大元素#215 LeetCode ↗ | 维护大小为 K 的最小堆,堆顶即为第 K 大 |
| 中等 | 347. 前 K 个高频元素#347 LeetCode ↗ | 哈希表统计频率 + 最小堆维护 Top K |
| 中等 | 692. 前K个高频单词#692 LeetCode ↗ | 类似 347,注意排序规则(频率降序,字典序升序) |
| 中等 | 973. 最接近原点的 K 个点#973 LeetCode ↗ | 计算距离后维护最大堆(或最小堆 + 排序) |
| 中等 | LeetCode ↗ | 二分法或最小堆(多路归并思想) |
| 困难 | LeetCode ↗ | 二分答案 + 双指针,堆解法也可行 |
- 中等#215
维护大小为 K 的最小堆,堆顶即为第 K 大
- 中等#347
哈希表统计频率 + 最小堆维护 Top K
- 中等#692
类似 347,注意排序规则(频率降序,字典序升序)
- 中等#973
计算距离后维护最大堆(或最小堆 + 排序)
- 中等#378
二分法或最小堆(多路归并思想)
- 困难#719
二分答案 + 双指针,堆解法也可行
三、数据流与动态中位数
3 条类型特点:数据是动态到达的,需要实时维护当前的中位数或最值。常用技巧是对顶堆:一个大顶堆维护较小的一半,一个小顶堆维护较大的一半 。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 困难 | 295. 数据流的中位数#295 LeetCode ↗ | 对顶堆:大顶堆放较小半,小顶堆放较大半,保持平衡 |
| 简单 | LeetCode ↗ | 维护大小为 K 的最小堆,堆顶即为第 K 大 |
| 中等 | 480. 滑动窗口中位数#480 LeetCode ↗ | 对顶堆 + 延迟删除(较复杂) |
- 困难#295
对顶堆:大顶堆放较小半,小顶堆放较大半,保持平衡
- 简单#703
维护大小为 K 的最小堆,堆顶即为第 K 大
- 中等#480
对顶堆 + 延迟删除(较复杂)
四、合并与连接问题
4 条类型特点:多个有序序列合并成一个有序序列,每次取当前最小的元素,适合用最小堆。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 困难 | 23. 合并K个升序链表#23 LeetCode ↗ | 将每个链表头节点放入最小堆,依次弹出并加入下一个节点 |
| 中等 | 1167. 连接棒材的最低费用#1167 LeetCode ↗ | 哈夫曼编码思想,每次取最小的两个合并 |
| 中等 | LeetCode ↗ | 最小堆,每次从堆顶取一对,加入下一对候选 |
| 困难 | 632. 最小区间#632 LeetCode ↗ | 最小堆维护当前每个列表的指针,记录最大最小值 |
- 困难#23
将每个链表头节点放入最小堆,依次弹出并加入下一个节点
- 中等#1167
哈夫曼编码思想,每次取最小的两个合并
- 中等#373
最小堆,每次从堆顶取一对,加入下一对候选
- 困难#632
最小堆维护当前每个列表的指针,记录最大最小值
五、任务调度与贪心
4 条类型特点:任务有优先级或冷却时间,需要合理安排顺序。通常用最大堆动态取当前最紧急的任务。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 中等 | 621. 任务调度器#621 LeetCode ↗ | 贪心 + 最大堆,每个周期取出 n+1 个不同任务 |
| 中等 | 767. 重构字符串#767 LeetCode ↗ | 最大堆按频率取字符,每次取两个不同的拼接 |
| 困难 | 358. K 距离间隔重排字符串#358 LeetCode ↗ | 类似 767,但间隔要求更严格 |
| 困难 | 502. IPO#502 LeetCode ↗ | 贪心 + 堆,每次从可达项目中选利润最大的 |
- 中等#621
贪心 + 最大堆,每个周期取出 n+1 个不同任务
- 中等#767
最大堆按频率取字符,每次取两个不同的拼接
- 困难#358
类似 767,但间隔要求更严格
- 困难#502
贪心 + 堆,每次从可达项目中选利润最大的
六、区间与会议安排
3 条类型特点:区间重叠、会议室安排等问题,常用最小堆维护当前正在使用的资源。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 中等 | 253. 会议室 II#253 LeetCode ↗ | 按开始时间排序,最小堆维护结束时间,判断是否需要新会议室 |
| 困难 | 218. 天际线问题#218 LeetCode ↗ | 扫描线 + 最大堆维护当前高度 |
| 困难 | 407. 接雨水 II#407 LeetCode ↗ | BFS + 最小堆,从边界向内收缩 |
- 中等#253
按开始时间排序,最小堆维护结束时间,判断是否需要新会议室
- 困难#218
扫描线 + 最大堆维护当前高度
- 困难#407
BFS + 最小堆,从边界向内收缩
七、其他经典堆问题
5 条| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 困难 | 239. 滑动窗口最大值#239 LeetCode ↗ | 虽可用单调队列更优,但堆 + 延迟删除也可解 |
| 中等 | 264. 丑数 II#264 LeetCode ↗ | 最小堆 + 哈希去重,或用三指针 DP |
| 中等 | 313. 超级丑数#313 LeetCode ↗ | 类似 264,但质数列表是给定的 |
| 中等 | 355. 设计推特#355 LeetCode ↗ | 哈希表 + 优先队列实现推文推送 |
| 中等 | 451. 根据字符出现频率排序#451 LeetCode ↗ | 哈希表统计频率后,可用最大堆排序 |
- 困难#239
虽可用单调队列更优,但堆 + 延迟删除也可解
- 中等#264
最小堆 + 哈希去重,或用三指针 DP
- 中等#313
类似 264,但质数列表是给定的
- 中等#355
哈希表 + 优先队列实现推文推送
- 中等#451
哈希表统计频率后,可用最大堆排序