https://leetcode.cn/problems/top-k-frequent-elements/description/
<aside> 💡
优先级队列:
先使用map存储元素与其出现次数,再将map中的元素存入一个优先级队列中。
// 用于创建小顶堆的仿函数
// 比较器的定义方式和排序规则有一些差异
// 返回true表示lhs的优先级比rhs低
class MyConmpare {
public:
bool operator()(const std::pair<int, int>& lhs, const std::pair<int, int>& rhs) {
return lhs.second > rhs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> mp;
// 先使用哈希表记录个元素的出现频率
for (int n : nums) {
mp[n]++;
}
// 使用小顶堆存放元素
// <元素类型, 容器, 比较方法>
std::priority_queue<std::pair<int, int>, vector<std::pair<int, int>>, MyConmpare> que;
// 优先级队列仅维护k个元素,低频元素弹出
for (auto item : mp) {
que.push(item);
if (que.size() > k) {
// 弹出低频元素
que.pop();
}
}
vector<int> ans(k, 0);
for (int i = 0; i < k; ++i) {
ans[i] = que.top().first;
que.pop();
}
return ans;
}
感觉哈希表也能做,也是利用map排序的特性,先用一个map统计频率,再将该map的key与value互换,存入另一个map中。从第二个map中取出频率最高的K个元素