Java實現 LeetCode 692 前K個高頻單詞(map的應用)

692. 前K個高頻單詞

給一非空的單詞列表,返回前 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;
    }
}
相關文章
相關標籤/搜索