Leetcode——前 K 个高频元素

Posted Yawn,

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——前 K 个高频元素相关的知识,希望对你有一定的参考价值。

1. 前 K 个高频元素

(1)优先队列

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> occurrences = new HashMap<Integer, Integer>();
        for(int num :nums){
            occurrences.put(num, occurrences.getOrDefault(num, 0)+1);           //记录每个数字出现的次数
        }

         // 维持一个K大的小顶堆,比较器也是int[]类型
         //int[] 的第一个元素代表数组的值,第二个元素代表了该值出现的次数
      
        PriorityQueue<int[]> queue = new PriorityQueue<int[]>((m , n) -> m[1] - n[1]);


        for(Map.Entry<Integer, Integer> entry:occurrences.entrySet()){
            int num = entry.getKey(),count = entry.getValue();
            if(queue.size() == k){                                  //如果堆已满(大小>=k)且当前数的次数比堆顶大,用当前元素替换堆顶元素
                if(queue.peek()[1]< count){
                    queue.poll();
                    queue.offer(new int[]{num, count});
                }
            }else{
                queue.offer(new int[]{num, count});
            }
        }

        int[] res = new int[k];                 //返回堆中的数字部分
        for(int i = 0; i<k; i++){
            res[i] = queue.poll()[0];
        }
        return res;
    }
}

注意:

   (m , n) -> m[1] - n[1] 可以换为:
         new Comparator<int[]>() {
            public int compare(int[] m, int[] n) {
                return m[1] - n[1];         //计数器判断cout大小,用作小顶堆
            }
        }

以上是关于Leetcode——前 K 个高频元素的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode——前 K 个高频元素

⭐算法入门⭐《哈希表》中等04 —— LeetCode 347. 前 K 个高频元素

[LeetCode]347. 前 K 个高频元素(堆)

leetcode之374前K个高频元素Golang

311.LeetCode | 347. 前 K 个高频元素

LeetCode刷题(130)~前 K 个高频元素最小堆|快速排列 难点!