前k个高频元素

135 阅读1分钟

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1]

这道题思路很明确,就是先把每个元素的频率算出来,然后排序

算频率,就直接Hash table就好了

然后就看官方的解答,有点离谱,官方利用小顶堆,来实现时间复杂度小于NlogN,这应该是有点争议的。

class Solution {public:    static bool b(pair<int,int>&x,pair<int,int>&y)    {        return x.second>y.second;    }     vector<int> topKFrequent(vector<int>& nums, int k) {            vector<int> ans;            unordered_map<int,int> m;            for(int a:nums)            {                ++m[a];            }           priority_queue<pair<int,int>,vector<pair<int,int>>,decltype(&b)> q(b);            for(auto [c,d]:m)            if(q.size()==k)            {                if(q.top().second<d)                {                    q.pop();                    q.emplace(c,d);                }                            }else q.emplace(c,d);            while(!q.empty())            {            ans.push_back(q.top().first);            q.pop();            }    return ans;    }};

注意

priority_queue

官方回答里,ans用的是emplace,用push_back也行,因为没有次序要求

里面有一个调试了很久,就是b也就是官方里面的cmp的来源,后来才发现要添加一个bool函数。

q.top.first表示的就是第一个元素

second就是第二个元素,注意second的写法