算法day34 前k个高频元素

题目描述

思路:哈希表+优先级队列

对于这样的一个序列,要统计出现频率前k个的元素,我们自然要利用一种办法来将重复元素的出现次数与这个元素映射起来,而这样的需求正是哈希表的强项所在。所以在一开始,我们可以使用哈希表,通过遍历数组的方式将数组中出现过的数字以及它出现的频率收集起来。接下来要处理的就是如何将出现频率前k个的元素从哈希表中筛选出来,这里我们采用一种经典的数据结构:堆。堆本质是一颗完全二叉树,它分为大根堆与小根堆两种形态,前者维护堆顶为最大值,后者维护堆顶为最小值。我们这里采用小根堆,这样我们通过循环不断地将堆顶弹出,直至堆的大小为k,然后再将堆内的哈希的键加入结果数组,最后返回。

代码如下

class Solution {
public:
class Mycomparsion{
    public:
        bool operator()(const pair<int,int> &lhs,const pair<int,int> &rhs){
            return lhs.second > rhs.second;
        }
};

vector<int> topKFrequent(vector<int>& nums, int k) {
    vector<int> res;
    int len = nums.size();
    unordered_map<int,int> map; 
    for(int i=0;i<len;i++){
        map[nums[i]]++;
    }
    priority_queue<pair<int,int>,vector<pair<int,int>>,Mycomparsion> pri_que; //优先级队列,自定义一个排序的函数,即维护一个小根堆
    for(unordered_map<int,int>::iterator it = map.begin();it!=map.end();it++){//不断的更迭队列,直至队列中剩下的k个元素是我们自己的目标
        pri_que.push(*it);
        if(pri_que.size()>k){
            pri_que.pop();
        }
    }
    for(int j=0;j<k;j++){
        res.push_back(pri_que.top().first);
        pri_que.pop();
    }
    return res;
  }
};

时间复杂度:O(nlogk)
空间复杂度:O(n)

END

posted on 2025-05-26 14:36  sakura430  阅读(16)  评论(0)    收藏  举报