vector<int> topKFrequent(vector<int>& nums, int k){
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++){
map[nums[i]]++;
}
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
for(unordered_map<int,int>::iterator it=map.begin();it!=map.end();it++){
if(q.size()==k){
if(q.top().first<it->second){
q.pop();
q.push(make_pair(it->second,it->first));
}
}else{
q.push(make_pair(it->second,it->first));
}
}
vector<int> res;
while(!q.empty()){
res.push_back(q.top().second);
q.pop();
}
reverse(res.begin(),res.end());
return res;
}
使用小顶堆,比较的时候,如果比堆顶最小的元素还小,那么肯定不是topk最大的了,不用处理,如果比堆顶元素大,那么删除堆顶元素,当前元素入队列。小顶堆声明方式:
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
后面比较函数是greater<pair<int,int>> ,默认是大顶堆,less<pair<int,int>>.也可以自定义重载比较函数:
static bool cmp(pair<int, int>& m, pair<int, int>& n) {
return m.second > n.second;
}
重载比较函数,static bool cmp (元素类型引用,元素类型引用){
//返回第一个数的频率大于第二个数的频率;
}