题目描述
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]
.
注意事项
- 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.
解题思路
sort(nums.begin(),nums.end(),
[&](int a, int b){
int cnt1=count(nums.begin(),nums.end(),a);
int cnt2=count(nums.begin(),nums.end(),b);
return cnt1>cnt2||(cnt1==cnt2&&a<b);
}
)
解决办法:
①对数组进行从小到大的排序。
②统计每个数的出现次数,用multimap保存,key是出现次数(因为出现次数很可能重复,所以用multimap而不是map),value是这个数值。
用multimap的好处是自动排序,在我们插入<key, value>键值对时,就会按照key的大小顺序进行存储。另外按网上的说法:当key值相等时,按插入先后排序。(题目中没提出现次数相等的按哪种顺序排,所以这个细节可以忽略。有兴趣的朋友可以深扒下multimap的存储顺序)
③从后面开始取出multimap前k个数字。
欢迎评论交流~~
代码
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
multimap<int,int> m;
int last=nums[0];
int i=0,head=0;
while(i<nums.size()){
while(nums[i]==last){++i;};
m.insert({(i-h),(nums[i-1])});
head=i;
last=nums[i];
}
vector<int> res;
auto it=m.rbegin();
for(i=0;i<k;++it,++i){
res.push_back(it->second);
}
return res;
}
};