[LeetCode]347. 前 K 個高頻元素(堆)

題目

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

示例 1:數組

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

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

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

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/top-k-frequent-elements
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。element

題解

  • 先遍歷一遍記錄各元素出現次數。
  • 使用小根堆維護前k個頻率最高元素(由於超過k個須要當前元素和堆頂元素比較,決定去掉哪一個,因此使用小根堆而不是大根堆),其中定義比較器使用根據HashMap獲得的元素頻率大小比較。

代碼

class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }

        PriorityQueue<Integer> minHeap = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return map.get(o1) - map.get(o2);
            }
        });

        for (int key : map.keySet()) {
            minHeap.add(key);
            if (minHeap.size() > k) {
                minHeap.poll();
            }
        }

        List<Integer> list = new LinkedList<>();
        for (int num : minHeap) {
            list.add(num);
        }
        return list;
    }
}
相關文章
相關標籤/搜索