前 K 個高頻元素(LeetCode第347題)java實現

一、題目描述

給定一個非空的整數數組,返回其中出現頻率前 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 是數組的大小。

二、解題思路

1、先使用哈希表,記錄下數組中每個元素出現的次數。我這裏用hashmap。

2、再使用小頂堆,將哈希表中的key入堆,如果對的大小大於了k,則拋出堆頂元素

3、再遍歷堆,用list接住,並返回。

三、java代碼

class Solution {
     public List<Integer> topKFrequent(int[] nums, int k) {
        //使用哈希表 和 小頂堆
        HashMap<Integer, Integer> count = new HashMap<>();
        for (int n : nums) {
            count.put(n, count.getOrDefault(n, 0)+1);
        }

        PriorityQueue<Integer> heap = new PriorityQueue<>((n1, n2) -> (count.get(n1)-count.get(n2)));
        for (int n : count.keySet()) {
            heap.add(n);
            if(heap.size()>k){
                heap.poll();
            }
        }

        List<Integer> list = new ArrayList<Integer>();
        while (!heap.isEmpty()){
            list.add(heap.poll());
        }
         return list;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章