题目
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.
Subscribe to see which companies asked this question
具体题目见网址https://leetcode.com/problems/top-k-frequent-elements/
代码一
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> count;
for(vector<int>::iterator it=nums.begin();it!=nums.end();++it)
++count[*it];
multimap<int,int,greater<int>> VecSort;
for( unordered_map<int, int>::iterator it=count.begin();it!=count.end();++it)
{
VecSort.insert(pair<int, int>((it->second), it->first));
}
vector<int> result(k,0);
multimap<int,int>::iterator it=VecSort.begin();
for (int i = 0; i <k; ++i,++it) {
result[i]=it->second;
}
return result;
}
};
代码二
class Solution {
public:
static bool cmp_by_value(const pair<int,int>& lhs, const pair<int,int>& rhs) {
return lhs.second > rhs.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> count;
for(vector<int>::iterator it=nums.begin();it!=nums.end();++it)
++count[*it];
vector<pair<int,int> > name_score_vec(count.begin(), count.end());
sort(name_score_vec.begin(), name_score_vec.end(), cmp_by_value);
vector<int> result(k,0);
for (int i = 0; i <k; ++i) {
result[i]=name_score_vec[i].first;
}
return result;
}
};