前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)

相关推荐
有梦想的攻城狮5 分钟前
spring中的@RabbitListener注解详解
java·后端·spring·rabbitlistener
李斯维7 分钟前
循序渐进 Android Binder(二):传递自定义对象和 AIDL 回调
android·java·android studio
androidwork8 分钟前
OkHttp 3.0源码解析:从设计理念到核心实现
android·java·okhttp·kotlin
程序员岳焱10 分钟前
Java 程序员成长记(二):菜鸟入职之 MyBatis XML「陷阱」
java·后端·程序员
我命由我1234512 分钟前
Spring Boot 项目集成 Redis 问题:RedisTemplate 多余空格问题
java·开发语言·spring boot·redis·后端·java-ee·intellij-idea
面朝大海,春不暖,花不开12 分钟前
Spring Boot消息系统开发指南
java·spring boot·后端
程序员岳焱14 分钟前
Java 程序员成长记(三):菜鸟入职之@Transactional「罢工」
java·后端·编程语言
Rocky40122 分钟前
JAVAEE->多线程:锁策略
java·开发语言·jvm
白宇横流学长22 分钟前
基于J2EE架构的在线考试系统设计与实现【源码+文档】
java·架构·java-ee
猫咪老师199527 分钟前
多系统一键打包docker compose下所有镜像并且使用
java·docker·容器