Given a non-empty array of integers, return the k most frequent elements.
For example,
Given [1,1,1,2,2,3]
and k = 2, return [1,2]
.
Note:
- You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
- Your algorithm's time complexity must be better than O(n log n), where n is the array's size.
思路:利用map存储数字及其对应的频率,然后再用multimap以频率作为key,数字作为val进行储存,注意其是降序排列,所以用greater
知识点:map,multimap,priority_queue
代码1:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int,int> s;
for(int i:nums){
s[i]++;
}
vector<int> res;
priority_queue<pair<int,int>> pq;
for(auto it = s.begin(); it != s.end(); it++){
pair<int,int> temp(it->second, it->first);
pq.push(temp);
if(pq.size() > (int)s.size() - k){
res.push_back(pq.top().second);
pq.pop();
}
}
return res;
}
};
代码2:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int,int> m1;
multimap<int,int, greater<int>> m2;
for(int i:nums){m1[i]++;}
for(auto mm:m1){m2.insert(pair<int,int>(mm.second,mm.first));}
vector<int> res;
multimap<int,int,greater<int>>::iterator p;
p=m2.begin();
for(;k;k--){
res.push_back(p->second);
p++;
}
return res;
}
};
代码3:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> map;
for(int num : nums){
map[num]++;
}
vector<int> res;
// pair<first, second>: first is frequency, second is number
priority_queue<pair<int,int>> pq;
for(auto it = map.begin(); it != map.end(); it++){
pq.push(make_pair(it->second, it->first));
if(pq.size() > (int)map.size() - k){
res.push_back(pq.top().second);
pq.pop();
}
}
return res;
}
};