2025-04-08 12:00:24 +08:00
|
|
|
|
- 当然可以!下面是你可以直接记到笔记里的内容:
|
2025-03-24 16:04:56 +08:00
|
|
|
|
|
2025-04-08 12:00:24 +08:00
|
|
|
|
------
|
2025-03-24 16:04:56 +08:00
|
|
|
|
|
2025-04-08 12:00:24 +08:00
|
|
|
|
### 🧠 题型:**Top K 高频元素**(LeetCode 347)
|
2025-03-24 16:04:56 +08:00
|
|
|
|
|
2025-04-08 12:00:24 +08:00
|
|
|
|
**题目描述**:给定一个整数数组 `nums` 和一个整数 `k`,返回出现频率最高的前 `k` 个元素,返回顺序可以任意。
|
2025-03-24 16:04:56 +08:00
|
|
|
|
|
2025-04-08 12:00:24 +08:00
|
|
|
|
------
|
2025-03-24 16:04:56 +08:00
|
|
|
|
|
2025-04-08 12:00:24 +08:00
|
|
|
|
### 📌 解法一:大根堆(最大堆)
|
2025-03-24 16:04:56 +08:00
|
|
|
|
|
2025-04-08 12:00:24 +08:00
|
|
|
|
**思路**:
|
2025-03-24 16:04:56 +08:00
|
|
|
|
|
2025-04-08 12:00:24 +08:00
|
|
|
|
1. 使用 `HashMap` 统计每个元素的出现频率。
|
|
|
|
|
2. 构建一个**大根堆**(`PriorityQueue` + 自定义比较器),根据频率降序排列。
|
|
|
|
|
3. 将所有元素加入堆中,**弹出前 `k` 个元素**即为答案。
|
2025-03-24 16:04:56 +08:00
|
|
|
|
|
2025-04-08 12:00:24 +08:00
|
|
|
|
**适合场景**:
|
|
|
|
|
|
|
|
|
|
- 实现简单,适用于对全部元素排序后取前 `k` 个。
|
|
|
|
|
- 时间复杂度:**O(n log n)**,因为需要将所有 `n` 个元素都加入堆。
|
|
|
|
|
|
|
|
|
|
------
|
|
|
|
|
|
|
|
|
|
### 📌 解法二:小根堆(最小堆)
|
|
|
|
|
|
|
|
|
|
**思路**:
|
|
|
|
|
|
|
|
|
|
1. 使用 `HashMap` 统计频率。
|
|
|
|
|
2. 构建一个**小根堆**,堆中仅保存前 `k` 个高频元素。
|
|
|
|
|
3. 遍历每个元素:
|
|
|
|
|
- 如果堆未满,直接加入。
|
|
|
|
|
- 如果当前元素频率大于堆顶(最小频率),则弹出堆顶,加入当前元素。
|
|
|
|
|
4. 最终堆中保存的就是前 `k` 个高频元素。
|
|
|
|
|
|
|
|
|
|
**适合场景**:
|
|
|
|
|
|
|
|
|
|
- 当 `k ≪ n` 时效率更高。
|
|
|
|
|
- 时间复杂度:**O(n log k)**,因为堆中最多维护 `k` 个元素。
|
|
|
|
|
|
|
|
|
|
------
|
|
|
|
|
|
|
|
|
|
### ✅ 总结对比:
|
|
|
|
|
|
|
|
|
|
| 方法 | 适合场景 | 时间复杂度 | 空间复杂度 |
|
|
|
|
|
| ------ | --------------- | ---------- | ---------- |
|
|
|
|
|
| 大根堆 | k ≈ n,简单易写 | O(n log n) | O(n) |
|
|
|
|
|
| 小根堆 | k ≪ n,更高效 | O(n log k) | O(n) |
|
|
|
|
|
|
|
|
|
|
------
|
|
|
|
|
|
|
|
|
|
需要我再写成代码模板笔记也可以,随时说!
|