题目:
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
题解:
题目要求时间复杂度要小于O(NlogN),所以先排除快排之类的排序算法。
考虑到我们解决第k小元素时使用了堆这一数据结构,所以本题自然可以使用堆来解决,我们需要频率前k高的元素,堆的大小定为k,往大小为k的堆中插入一个元素O(logK)(堆为完全二叉树),那么n个数插入n次,时间复杂度O(NlongK) 小于 O(NlogN),因而我们需要维护好频率与元素的对应关系,pair<int,int>将会是很方便的。
tips:
- 堆使用优先队列将会是非常方便的。
- pair<int,int>进行比较时,先比较first,first相同再比较second
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> mp;
for(auto it:nums)
mp[it]++;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >pq;
for(auto it:mp)
{
if(pq.size()==k)
{
if(it.second>pq.top().first)
{
pq.pop();
//此处first和second顺序不可颠倒,其表示先对first(频率从小到大排序)
pq.push(make_pair(it.second,it.first));
}
}else
pq.push(make_pair(it.second,it.first));
}
vector<int> ans;
while(!pq.empty())
{
ans.emplace_back(pq.top().second);
pq.pop();
}
//记得翻转
reverse(ans.begin(),ans.end());
return ans;
}
};