class Solution
{
public:
using iipair=pair<int,int>; //定义pair<K,T>的类型别名
class functortocomp //以函数对象去自定义谓词
{
public:
bool operator()(const iipair& p1,const iipair& p2)
{
return p1.second>p2.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k)
{
unordered_map<int,int> hashtable; //首先建立散列表并将元素于其频次一一进行嵌入因为不是顺序插入,因此要使用此映射容器
for(auto t:nums)
++hashtable[t]; //对于STL中的散列表而言,因为映射容器定义了operator[]()成员函数,所以其散列地址与关键码的映射可通过索引进行(?整形变量初始为0?)。遍历过后散列表中就形成了关键码(first)与其出现频次(second)的对应关系
priority_queue<iipair,vector<iipair>,functortocomp> minheap; //建立一个优先级队列,其中第一个参数为元素的类型,第二个参数为使用的基础容器,第三个为谓词;综合来看实际建立了一个以频次为导向的小顶堆
for(auto t:hashtable)
{
if(minheap.size()<k)
minheap.push(t);
else if(minheap.size()==k)
{
/***!!注:因为这里要将待插入元素与堆中最小元素进行对比,且priority_queue不同与queue,不能访问末尾(即堆底)元素,因此不能建立最大堆!!**/
//只插入那些频数大于小顶堆堆顶频数的pair(隐含着先到先得,即即使两个数出现的频次一样,但是先到者先得)//
if(minheap.top().second<t.second)
{
minheap.push(t);
minheap.pop();
}
}
}
vector<int> findk(k,0);
for(int i=0;i<k;i++)
{
findk[i]=minheap.top().first;
minheap.pop();
}
return findk;
}
};
leetcode 347 找出数组中最常出现的k个数
最新推荐文章于 2022-05-05 12:54:50 发布