
一、题目描述

二、算法原理
思路:建立 k 个节点的小根堆

原因:通过不断的入让数据入堆,导致大的数据沉底,如果节点大于 k 个,把堆顶的数据出堆,此时出的就是小的值,不断出,不断的入,导致最后留在堆的元素是前 k 个大的数据;
注意:堆的比较函数要特殊处理,当两个字符串的长度一样时,让ASCLL的值大的入堆;由于大的值沉底,所以我们的结果是逆序的;
三、代码示例
cpp
struct Compare
{
public:
bool operator()(const pair<string,int>& x,const pair<string,int>& y)//比较函数
{
if(x.second == y.second)
{
return x.first < y.first;
}
else
{
return x.second > y.second;
}
}
};
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
//处理频次
unordered_map<string,int> hash;
for(auto& ch : words) hash[ch]++;
//实现堆
priority_queue<pair<string,int>,vector<pair<string,int>>,Compare> mer;
//维护堆的 K 个节点
for(auto& e : hash)
{
mer.push(e);
if(mer.size() > k)
{
mer.pop();
}
}
//从堆中拿出 k 个节点
vector<string> ret;
ret.resize(mer.size());
for(int i = ret.size() - 1 ; i >= 0; i--)//因为这个堆是小根堆,所以堆顶是小值,所以要逆序放置
{
ret[i] = mer.top().first;
mer.pop();
}
return ret;
}
};