栈与队列:TOP-K问题:前 K 个高频元素
解法一:粗暴排序法
最简单粗暴的思路就是 使用排序算法对元素按照频率由高到低进行排序,然后再取前 kk 个元素。
以下十种排序算法,任你挑选!
可以发现,使用常规的诸如 冒泡、选择、甚至快速排序都是不满足题目要求,它们的时间复杂度都是大于或者等于 O(n logn)O(nlogn),而题目要求算法的时间复杂度必须优于 O(n log n)O(nlogn)。
解法二:
- 借助 哈希表 来建立数字和其出现次数的映射,遍历一遍数组统计元素的频率
- 维护一个元素数目为 k 的最小堆
- 每次都将新的元素与堆顶元素(堆中频率最小的元素)进行比较
- 如果新的元素的频率比堆顶端的元素大,则弹出堆顶端的元素,将新的元素添加进堆中
- 最终,堆中的 k 个元素即为前 k 个高频元素
对于优先队列的实现原理在这里,加强理解:点我跳转
代码如下:
class Solution {
public:
class Com
{
public:
bool operator ()(const pair<