692. 前K个高频单词

692. 前K个高频单词

给一非空的单词列表,返回前 k 个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。

示例 1:

输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
    注意,按字母顺序 "i" 在 "love" 之前。

优先队列+哈希表

  • 经典优先队列问题,找出前K个出现次数最多的单词,且当单词一样多时排列字母顺序。
  • 难点在于如何自定义优先队列的比较类型(cmp)。死记硬背。。。
  • auto cmp = [&](const char &c1, const char &c2) {return array[c1] > array[c2]; };
  • priority_queue<char, vector<char>, decltype(cmp)> myqueue{cmp};
class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> mymap;
        for(auto word: words)
            mymap[word]++;
        auto cmp = [&](const string &s1, const string &s2){
            return (mymap[s1] < mymap[s2]) || (mymap[s1] == mymap[s2] && s1 >= s2) ;
        };
        priority_queue<string, vector<string>,  decltype(cmp)> myqueue{cmp};
        for(auto iter = mymap.begin(); iter != mymap.end();++iter)
            myqueue.push(iter -> first);
        vector<string> ans;
        for(int i = 0; i < k; ++i){
           string tmp = myqueue.top();
           myqueue.pop();
            ans.push_back(tmp);
        }
        return ans;
    }
};

posted @ 2021-05-20 23:13  andymori  阅读(95)  评论(0)    收藏  举报