给定一个非空的整数数组,返回其中出现频率前 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的写法