【大根堆 Java】使用优先队列+HashMap 解决前 K 个高频元素问题
创始人
2024-01-29 08:11:43
0

一、题目描述

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

示例
在这里插入图片描述

二、思路

本题我们主要完成两个步骤:

  1. 统计出每个元素出现的次数
  2. 找出出现次数最多的前 K 个元素
  • 对第一个步骤,我们可以使用 HashMap 进行统计,统计方法如下:

这一步中,最需要学习的就是 getOrDefault() 的使用,其若是在 map 中找对对应 key 的 value,则返回 value 值,否则返回我们设置的默认值

        Map map = new HashMap<>();for(int i=0; imap.put(nums[i], map.getOrDefault(nums[i], 0));}
  • 对第二个步骤 ——
    1.首先我们建立一大根堆,建立方式为使用 Java 语言为我们提高的优先队列 PriorityQueue
    2.然后我们将上面步骤得到的 HashMap 中的每个映射存放到这个优先队列中
    3.从优先队列中取出前 K 个元素

扩展知识:

优先队列中存储的类型为 Map.Entry , —— 这个 Map.Entry 是什么?

: Map中存放的元素均为键值对,每一个键值对必然存在一个映射关系 ,Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value

也就是说 每一个键值对就是一个Entry,Map.Entry里面包含getKey()和getValue()方法

第二步代码:

      Set> entries = map.entrySet(); // 用于遍历向大根堆中加入键值对// 根据map中的value值,构建于一个大顶堆(o1 - o2: 小根堆, o2 - o1 : 大根堆)PriorityQueue> queue = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue());for (Map.Entry entry : entries) { // 将键值对加入大根堆中queue.offer(entry);}for (int i = k - 1; i >= 0; i--) { // 取出前K个元素result[i] = queue.poll().getKey();}

三、完整代码

    public int[] topKFrequen2(int[] nums, int k) {int[] res = new int[k];Map map = new HashMap<>();for(int i=0; imap.put(nums[i], map.getOrDefault(nums[i], 0));}Set> set = map.entrySet();PriorityQueue> priorityQueue = new PriorityQueue<>((o1, o2) -> (o2.getValue() - o1.getValue()));for(Map.Entry entry: set){priorityQueue.add(entry);}for(int i=0; i<=k; i++){res[i] = priorityQueue.poll().getKey();}return res;}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...