前k个高频元素_优先队列_java

前k个高频元素

leetcode链接

问题描述

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

提示:

1 <= nums.length <= 10^5

k 的取值范围是 1, 数组中不相同的元素的个数

题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

示例

示例 1:

输入: nums = 1,1,1,2,2,3, k = 2

输出: 1,2

示例 2:

输入: nums = 1, k = 1

输出: 1

解题思路

  1. 用map记录数组中元素出现的频率

    1. 将map中元素都存入PriorityQueue,优先队列会维护队列内元素以大根堆(或小根堆)的形式排序
    2. 从优先队列中取k个元素的key,即为数组的前K个高频元素

代码实现

java 复制代码
class Solution {
   public int[] topKFrequent(int[] nums, int k) {

       Map<Integer, Integer> map = new HashMap<>();

       //用map记录数组中元素出现的频率
       for (Integer num : nums) {
           map.put(num, map.getOrDefault(num,0)+1);
       }

       //创建一个以大根堆形式存储队内元素的优先队列
       PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2) -> pair2[1] - pair1[1]);

       //map中元素以数组形式存入PriorityQueue
       for (Map.Entry entry : map.entrySet()) {
           //注意:此处需要进行强制类型转换,因为entry.getKey()与entry.getValue()的返回类型是Object!!!
           pq.add(new int[]{(Integer)entry.getKey(),(Integer)entry.getValue()});
       }

       //从优先级队列中取k个元素的key,并加入结果集中
       int[] res = new int[k];
       for (int i = 0;  i < k; i++) {
           res[i] = pq.poll()[0];
       }

       return res;


   }
}

复杂度

时间复杂度:

PriorityQueue类的add方法的时间复杂度为O(logn), 调用了n次所以时间复杂度为O(nlogn)

空间复杂度:

度:

PriorityQueue类的add方法的时间复杂度为O(logn), 调用了n次所以时间复杂度为O(nlogn)

空间复杂度:

O(n)

相关推荐
8Qi815 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS15 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
在繁华处16 小时前
Java从零到熟练(九):并发编程基础
java·开发语言
木头程序员16 小时前
SSM框架学习笔记
java·开发语言·mysql·spring·maven
李白你好16 小时前
页面资产梳理 · 技术指纹识别 · Spring 端点探测
java·后端·spring
一起逃去看海吧16 小时前
dify-03
java·linux·开发语言
我是一颗柠檬16 小时前
【Java后端技术亮点】热Key探测与本地缓存二级防护:Redis热点问题的终极解决方案
java·redis·后端·缓存·中间件
Boom_Shu17 小时前
长方形的关系
数据结构·c++·算法
Refrain_zc17 小时前
Android 音视频通话核心 —— 音频编码(AAC)完整解析
java
xiaoshuaishuai817 小时前
C# AvaloniaUI 资源找不到报错
java·服务器·前端·windows·c#