leetcode347.前k个高频元素(哈希 堆)

思路

题目最终需要返回的是前 k 个频率最大的元素,可以想到借助堆这种数据结构,对于 k频率之后的元素不用再去处理,进一步优化时间复杂度。

在这里插入图片描述
具体操作为:

  • 借助 哈希表 来建立数字和其出现次数的映射,遍历一遍数组统计元素的频率
  • 维护一个元素数目为 k的** 最小堆**
  • 每次都将新的元素与堆顶元素(堆中频率最小的元素)进行比较
  • 如果新的元素的频率比堆顶端的元素大,则弹出堆顶端的元素,将新的元素添加进堆中
  • 最终,堆中的 k 个元素即为前 k个高频元素

时间复杂度

在这里插入图片描述

代码

class Solution {
public:
    struct cmp{
    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) {
        map<int, int>m;
        //利用哈希表记录每个整数出现的次数
        for(int i=0;i<nums.size();++i)
            m[nums[i]]++;

        //建立小顶堆
        priority_queue<pair<int, int>,vector<pair<int, int>>,cmp> que;
        for(map<int, int>::iterator it=m.begin();it!=m.end();++it)
        {
            que.push(*it);
            if(que.size()>k) que.pop();
        }
        //返回结果
        vector<int>result;
        for(int i=k-1;i>=0;--i)
        {
            result.push_back(que.top().first);
            que.pop();
        }
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_45019830/article/details/115308863
今日推荐