mybloger

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

LeetCode热题100-73题、前K个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        // 1. 统计频率
        Map<Integer,Integer> frequencyMap = new HashMap<>();
        for(int num : nums) {
            frequencyMap.put(num,frequencyMap.getOrDefault(num,0) + 1);
        }

        // 2. 创建最小堆,定义比较规则为元素的频率
        PriorityQueue<Integer> minHeap = new PriorityQueue<>(
            (a,b) -> frequencyMap.get(a) - frequencyMap.get(b)
        );

        // 3. 遍历频率哈希表,用最小堆维护前k个高频元素
        for (int num : frequencyMap.keySet()) {
            if (minHeap.size() < k) {
                minHeap.offer(num);
            } else {
                // 核心: 只有当当前元素的频率高于堆顶元素的频率时,才替换
                if (frequencyMap.get(num) > frequencyMap.get(minHeap.peek())) {
                    minHeap.poll();
                    minHeap.offer(num);
                }
            }
        }

        // 4. 输出结果
        int[] result = new int[k];
        int index = 0;
        while (!minHeap.isEmpty()) {
            result[index++] = minHeap.poll();
        }
        return result;
    }
}
posted on 2025-10-07 16:44  万能包哥  阅读(6)  评论(0)    收藏  举报