LeetCode从低效到高效,点击
一、题目描述:
题目要求
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
来源:力扣(LeetCode)链接
示例
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
二、思路分析:
本题是215. 数组中的第K个最大元素的变形,本题要求返回的是出现频率前K高的元素。 首先我们需要排序的不是元素本身,而是元素出现的频率,那么首先想到的存储结构就是哈希表的结构<元素,频率>,之后对频率的第k个就回到了215题,这里为了代码少写几行考虑就使用的小根堆的方案,也可以根据215的代码写快排+二分的版本。
三、AC 代码:
先放到哈希表里,再放到小根堆里
// great -> 小根堆 -> 剩下的都是大的
class paircomp{
public:
bool operator()(const pair<int,int> l,const pair<int,int> r){
return l.second>r.second;
}
};
// 12 ms 13.3 MB
vector<int> topKFrequent(vector<int>& nums, int k) {
// key是数值,value是出现的频次
unordered_map<int,int> occur;
for(auto v:nums){
occur[v]++;
}
// 使用堆排序或者快速查找+二分的思路(215题这两种思路都有)
// 到这一步就回到了求前k个的问题了 只不过结构不同
priority_queue<pair<int,int>,vector<pair<int,int>>,paircomp> pq;
for(auto it=occur.begin();it!=occur.end();it++){
pq.emplace(*it);
if(pq.size()>k){
pq.pop();
}
}
vector<int> out(k);
for(int i=k-1;i>=0;i--){
out[i] = pq.top().first;
pq.pop();
}
return out;
}
四、总结:
注意小根堆的判断条件是选大的哪个,仿函数的写法要注意。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情