[栈和队列]前 K 个高频元素

一、题目描述

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]

示例 2:

输入: nums = [1], k = 1 输出: [1]

提示:

    1 <= nums.length <= 10^5 k 的取值范围是 [1, 数组中不相同的元素的个数] 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。


二、思路分析

分析做法 之前,我们先理解题意,刚开始我认为就是求元素个素大于等于k的元素有那些嘛,这不是很简单吗,遍历数组放到map中,key为值,value为次数,找到大于等于k的就ok啦! TMD,根本不是这个意思!题目的意思是 求出前k个高频的元素!简单的说就是按照出现的频率排序,找到前k个!重点是前k个,不是频率大于等于k的元素有那些!XDM!

题目的意思我们知道了,我们分析一下怎么解决!

    第一步,还是遍历元素放到map中,key为数组的值,value为值出现的次数 第二步骤,其实就是排序,找到前k个,答案就出来了! 其实我们可以用优先级队列来进行升序排序,添加元素的时候如果队列中元素个数大于k,把对头踢出即可! 最后队列就是我们想要的结果!

三、AC代码

class Solution {
          
   
    public int[] topKFrequent(int[] nums, int k) {
          
   
        int[] results = new int[k];

        Map<Integer, Integer> map = new HashMap<>();
        for (int i : nums){
          
   
            map.put(i, map.getOrDefault(i, 0) + 1);
        }

        // 小顶堆,升序排列
        PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>(
            (o1, o2) ->{
          
   
                return o1.getValue() - o2.getValue();
            }
        );

        for (Map.Entry<Integer, Integer> entry : map.entrySet()){
          
   
            queue.offer(entry);
            if (queue.size() > k){
          
   
                queue.poll();
            }
        }

        for (int i = 0; i < k; i++){
          
   
            results[i] = queue.poll().getKey();
        }

        return results;
    }
}

四、总结

    优先级队列的使用(PriorityQueue) 前k个高频的元素 **不等于 **元素个素大于等于K的元素

感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤
经验分享 程序员 微信小程序 职场和发展