数据结构与算法:堆
堆
前 K 个高频元素
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
示例 1:
1 | 输入: nums = [1,1,1,2,2,3], k = 2 |
示例 2:
1 | 输入: nums = [1], k = 1 |
思路
使用map记录每个元素的出现次数,然后根据出现次数排序,找到前K个元素。
优化方法
由于可能有 O(N) 个不同的出现次数(其中 N 为原数组长度),故总的算法复杂度会达到 O(NlogN),因此,维护一个大小为k的小根堆,将map中元素的出现次数和堆顶元素出现次数比较,如果次数更大,那就放入堆中,更小就说明按照出现次数排序,当前遍历元素前面必然有至少k个元素,舍弃。由于堆的大小至多为 k,因此每次堆操作需要 O(logk) 的时间,共需 O(Nlogk) 的时间。
代码
1 | class Solution { |
注意
- 优先队列使用
1 | //decltype(&cmp):指定比较函数的类型(函数指针类型) |
- 如何遍历map
1 | for (const auto& pair : map) |
或者
1 | for (auto& [num, count] : map) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XTY的妙妙屋!