典型可以使用优先队列的。
class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { assert(k>0); //统计每个元素出现的频率 unordered_map<int,int> freq; //<元素,频率> for(int i=0; i<nums.size();i++){ freq[nums[i]] ++; } assert(k<=freq.size()); //扫描freq,维护当前出现频率最高的k个元素 //在优先队列中,按照频率排序,所以数据对是(频率,元素)的形式.因为在pair中比较时,先比较的是频率 priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > pq; //优先队列,从小到大排序 for(unordered_map<int, int>::iterator iter = freq.begin(); iter!=freq.end(); iter++){ //当前的优先队列已经维护了k个出现频率最高的元素 if(pq.size() == k){ if(iter->second > pq.top().first){ pq.pop(); //将更小频率的元素扔掉 pq.push(make_pair(iter->second, iter->first)); } } else pq.push(make_pair(iter->second, iter->first)); } vector<int> res; while(!pq.empty()){ res.push_back(pq.top().second); pq.pop(); } return res; } };