347. 前 K 个高频元素

 1 class Solution 
 2 {
 3 public:
 4     vector<int> topKFrequent(vector<int>& nums, int k) 
 5     {
 6         vector<int> res;
 7         unordered_map<int,int> hash;
 8         for(auto a : nums) hash[a] ++;
 9         priority_queue<pair<int,int>> pq;
10         for(auto a : hash) pq.push({a.second,a.first});
11         while(k --)
12         {
13             if(!pq.empty())
14             {
15                 res.push_back(pq.top().second);
16                 pq.pop();
17             }
18         }
19         return res;
20     }
21 };

 

 1 class Solution 
 2 {
 3 public:
 4     //对出现的次数进行排序,且从大到小进行排序
 5     //你可以按任意顺序返回答案
 6     int partition(vector<pair<int,int>> &a,int start, int end)
 7     {
 8         //int index = start + rand() % (end - start + 1);
 9         //swap(a[index],a[end]); //随机化
10 
11         int small = start - 1;
12         for(int i = start;i < end;i ++)
13             if(a[i].second > a[end].second)     
14                 swap(a[i],a[++small]);
15         swap(a[++small],a[end]);
16         return small;
17     }
18 
19     void select(vector<pair<int,int>> &a,int l,int r,int k)
20     {
21         if(l >= r) return;
22         int j = partition(a,l,r);
23         int k1 = k - 1;
24         if(k1 == j) return; // j刚好等于k1 
25         else if(k1 < j) select(a,l,j - 1,k);
26         else select(a,j + 1,r,k);
27     }
28 
29     vector<int> topKFrequent(vector<int>& nums, int k) 
30     {
31         unordered_map<int,int> ma;
32         for(int i : nums) ma[i] ++;
33         vector<pair<int,int>> ve(ma.begin(),ma.end());
34         vector<int> res;
35         select(ve,0,ve.size() - 1,k);
36         for(int i = 0;i < k;i ++) res.push_back(ve[i].first);
37         return res;
38     }
39 };

 

posted @ 2020-04-22 19:19  Jinxiaobo0509  阅读(97)  评论(0)    收藏  举报