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;
    }
};
posted @ 2021-04-07 17:34  Mrsdwang  阅读(41)  评论(0编辑  收藏  举报