LeetCode 692. Top K Frequent Words (medium)
    给一非空的单词列表,返回前 k 个出现次数最多的单词。
    返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。

    1. 示例 1
    2. 输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2输出: ["i", "love"]解析: "i" "love" 为出现次数最多的两个单词,均为2次。 注意,按字母顺序 "i" "love" 之前。
    3. 示例 2
    4. 输入: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4输出: ["the", "is", "sunny", "day"]解析: "the", "is", "sunny" "day" 是出现次数最多的四个单词, 出现次数依次为 4, 3, 2 1 次。

    注意:
    假定 k 总为有效值, 1 ≤ k ≤ 集合元素数。输入的单词均由小写字母组成。
    扩展练习:
    尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

    class Solution {
    public:
        typedef pair<string, int> Node;
    
        struct custom_compare{
            bool operator()(const Node& a, const Node& b){
                // order by alphabet ASC
                if(a.second == b.second)
                    return a.first < b.first;
                return a.second > b.second;
            }
        };
    
        vector<string> topKFrequent(vector<string>& words, int k) {
            unordered_map<string, int> count;
            for(auto word: words)
                count[word]++;
    
            /*
            // annother possible solution
            auto comp = [](const Node& a, const Node& b){
                // order by alphabet ASC
                if(a.second == b.second)
                    return a.first < b.first;
                return a.second > b.second;
            };
    
            priority_queue<Node, vector<Node>, decltype(comp)> q(comp);
            */
    
            priority_queue<Node, vector<Node>, custom_compare> q;
    
            for(auto c: count){
                q.push(c);
                if(q.size()>k) q.pop();
            }
    
            vector<string> ans;
            while(!q.empty()){
                ans.push_back(q.top().first);
                q.pop();
            }
    
            reverse(ans.begin(), ans.end());
            return ans;
        }
    };
    

    image.png