代码随想录:前K个高频元素
这个逼优先队列是真不好写啊。
代码从上到下说吧,首先是map,原来这个map能用索引啊,map[i],i即指的键值,而且默认键值对的值是0。
然后说这个优先队列,我只能说以后不想叫这玩意儿队列,因为这玩意儿一来不是个队列,一般是vector做底层,二来使用规范和queue也不一样,是用top的。以后干脆还是叫大根堆小根堆。
然后来讲比较函数,这玩意更是纯逆天,堆排序中默认是大根堆,即less
class compare{
operator()(int a,int b)
};
比较函数的含义是,如果第一个元素的优先级在第二个之前,则返回true,如a>b的意思就是,a>b时a的优先级更高,即降序排列。
不过您猜怎么着,这个b堆排序因为底层实现的原因,是反过来的,a>b的时候降序,反而是几把小根堆。
只能说,希望之后别用到这玩意儿。
代码不难如下:
class Solution {
public:
class compare {
public:
bool operator()(pair<int, int> a, pair<int, int> b) {
return a.second > b.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> target;
for (int num : nums) {
auto it = target.find(num);
if (it != target.end()) {
it->second++;
} else {
target.insert(make_pair(num, 1));
}
}
// 哎这b比较函数太不好写了
priority_queue<pair<int, int>, vector<pair<int, int>>, compare> que;
for(auto it:target){
que.push(it);
if(que.size()>k){
que.pop();
}
}
vector<int> res;
while(!que.empty()){
res.push_back(que.top().first);
que.pop();
}
return res;
}
};
标签:map,target,int,代码,随想录,vector,que,高频
From: https://www.cnblogs.com/huigugu/p/18611152