md_files/自学/草稿.md

53 lines
1.7 KiB
Markdown
Raw Normal View History

- 当然可以!下面是你可以直接记到笔记里的内容:
------
### 🧠 题型:**Top K 高频元素**LeetCode 347
**题目描述**:给定一个整数数组 `nums` 和一个整数 `k`,返回出现频率最高的前 `k` 个元素,返回顺序可以任意。
------
### 📌 解法一:大根堆(最大堆)
**思路**
1. 使用 `HashMap` 统计每个元素的出现频率。
2. 构建一个**大根堆**`PriorityQueue` + 自定义比较器),根据频率降序排列。
3. 将所有元素加入堆中,**弹出前 `k` 个元素**即为答案。
**适合场景**
- 实现简单,适用于对全部元素排序后取前 `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) |
------
需要我再写成代码模板笔记也可以,随时说!