# 692. Top K Frequent Words

Given an array of strings `words` and an integer `k`, return *the* `k` *most frequent strings*.

Return the answer **sorted** by **the frequency** from highest to lowest. Sort the words with the same frequency by their **lexicographical order**.

**Example 1:**

<pre><code><strong>Input: words = ["i","love","leetcode","i","love","coding"], k = 2
</strong><strong>Output: ["i","love"]
</strong><strong>Explanation: "i" and "love" are the two most frequent words.
</strong>Note that "i" comes before "love" due to a lower alphabetical order.
</code></pre>

***My Solutions:***

```
public List<String> topKFrequent(String[] words, int k) {
    HashMap<String, Integer> map = new HashMap<>();
    for (String word : words) map.put(word, map.getOrDefault(word, 0) + 1);

    // a pq with bigger number first, and order alphabetically
    PriorityQueue<Map.Entry<String, Integer>> pq = new PriorityQueue<> (
        new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) {
                if (a.getValue() != b.getValue()) return b.getValue() - a.getValue();
                return a.getKey().compareTo(b.getKey());
            }
        }
    );

    // add elements to pq
    for (Map.Entry<String, Integer> element : map.entrySet()) pq.add(element);

    List<String> res = new ArrayList<>();
    for (int i = 0; i < k; i++) res.add(pq.poll().getKey());
    return res;
}
```
