給一非空的單詞列表,返回前 k 個出現次數最多的單詞。java
返回的答案應該按單詞出現頻率由高到低排序。若是不一樣的單詞有相同出現頻率,按字母順序排序。ide
示例 1:spa
輸入: [「i」, 「love」, 「leetcode」, 「i」, 「love」, 「coding」], k = 2
輸出: [「i」, 「love」]
解析: 「i」 和 「love」 爲出現次數最多的兩個單詞,均爲2次。
注意,按字母順序 「i」 在 「love」 以前。code
示例 2:排序
輸入: [「the」, 「day」, 「is」, 「sunny」, 「the」, 「the」, 「the」, 「sunny」, 「is」, 「is」], k = 4
輸出: [「the」, 「is」, 「sunny」, 「day」]
解析: 「the」, 「is」, 「sunny」 和 「day」 是出現次數最多的四個單詞,
出現次數依次爲 4, 3, 2 和 1 次。leetcode
注意:get
假定 k 總爲有效值, 1 ≤ k ≤ 集合元素數。
輸入的單詞均由小寫字母組成。it
擴展練習:io
嘗試以 O(n log k) 時間複雜度和 O(n) 空間複雜度解決。class
class Solution { public List<String> topKFrequent(String[] words, int k) { HashMap<String,Integer>count = new HashMap<>(); for(String word:words){ count.put(word,count.getOrDefault(word,0)+1); } PriorityQueue<String>heap = new PriorityQueue<String>((w1,w2)->count.get(w1).equals(count.get(w2))?w2.compareTo(w1):count.get(w1)-count.get(w2)); for(String word:count.keySet()){ heap.add(word); if(heap.size()>k)heap.poll(); } List<String>res = new LinkedList<>(); while(!heap.isEmpty())res.add(heap.poll()); Collections.reverse(res); return res; } }