347. Top K Frequent Elements
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.
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> countNum;
for(unsigned int i=0;i<nums.size();i++)
countNum[nums[i]]++;
vector< pair<int,int> > tmp;
for(unordered_map<int,int>::iterator it=countNum.begin();it!=countNum.end();it++)
tmp.push_back(*it);
sort(tmp.begin(),tmp.end(),[=](pair<int, int>&a, pair<int, int>&b) {return a.second > b.second;});
vector<int> result;
for(int i=0;i<k;i++)
result.push_back(tmp[i].first);
return result;
}
};
这道题需要了解的是C++ 11 Lambda表达式,可以参考:
因为如果按照下面的代码编写,结果就一直报错。网上查找以后明白,成员函数第一个参数默认是this指针, 所以compare函数其实是3个参数。
将compare函数变为static时,就没有this指针。
class Solution {
public:
bool compare(pair<int,int> p1,pair<int,int> p2)
{
return p1.second>p2.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> countNum;
for(unsigned int i=0;i<nums.size();i++)
countNum[nums[i]]++;
vector< pair<int,int> > tmp;
for(unordered_map<int,int>::iterator it=countNum.begin();it!=countNum.end();it++)
tmp.push_back(*it);
sort(tmp.begin(),tmp.end(),compare);
vector<int> result;
for(int i=0;i<k;i++)
result.push_back(tmp[i].first);
return result;
}
};