692. Top K Frequent Words
思路:
因为还要考虑到字母顺序,所以肯定能用堆来存储。这里还需要先计数每个单词出现的次数,可以考虑用hash map来计数,再以pair的类型存放进堆,因为这里堆用大顶堆即降序排序,我们对出现次数取负值即可,然后每次加入进堆都判断一次是否数量大于K了,如果大于就pop掉堆顶元素,因为降序所以出现次数最多的取负后不会出现在堆顶,那么就能一直保持K个单词,且出现次数最多。那么我们再取出来放入数组里即可。但因为是降序 所以是出现次数少的先被取出来,所以最后要反转。如果出现数量一样,堆会按照字母顺序排列。
代码:
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
unordered_map<string,int> mp;
for(auto& word:words) mp[word]++; //对每个单词的数量计数
priority_queue<pair<int,string>> pq;
for(auto& [word,cnt]:mp){
pq.push({-cnt,word});
}
while(pq.size()>k) pq.pop();
vector<string> res;
while(!pq.empty()){
res.push_back(pq.top().second);
pq.pop();
}
reverse(res.begin(),res.end());
return res;
}
};