算法-前K個高頻元素

算法-前K個高頻元素

前K個高頻元素

347. 前 K 個高頻元素

給定一個非空的整數數組,返回其中出現頻率前 k 高的元素。

示例 1:

輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]
示例 2:

輸入: nums = [1], k = 1
輸出: [1]
說明:

你可以假設給定的 k 總是合理的,且 1 ≤ k ≤ 數組中不相同的元素的個數。
你的算法的時間複雜度必須優於 O(n log n) , n 是數組的大小。

這個題也算是一個有用的算法了,比如說熱搜?統計出現頻率最高的k個字符

其實本題也算是一個topK的題目,因此可以用堆實現。但是僅僅依靠堆是不夠的,因爲我們不知道每個元素出現的次數,所以我們用HashMap幫我們實現這一點:

    public List<Integer> topKFrequent(int[] nums, int k) {
        List<Integer> list=new LinkedList<>();
        //統計詞頻
        HashMap<Integer,Integer> map=new HashMap<>();
        for (int n:nums){
            if(!map.containsKey(n)){
                map.put(n,1);
            }else {
                map.put(n,map.get(n)+1);
            }
        }
        //重寫比較器,以詞的出現次數作爲比較器的比較項目
        PriorityQueue<Integer> heap=new PriorityQueue<>((o1,o2)->map.get(o1)-map.get(o2));
        for (Integer n:map.keySet()){
            heap.offer(n);
            if(heap.size()>k){
                heap.poll();
            }
        }
        while (heap.size()>0){
            list.add(0,heap.poll());//頭插到結果集
        }
        return list;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章