前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 小时前
C++ 学习教程,从入门到精通,C++ 友元、异常和其他特性 — 详细知识点(15)
开发语言·c++·学习
青山木5 小时前
Hot 100 --- 编辑距离
java·数据结构·算法·leetcode·动态规划
朝朝辞暮i5 小时前
C++ 第 26 课:对象、指针与 ->
java·开发语言·c++
长弓三石5 小时前
把 AgentScope Harness 装进 RuoYi-Vue-Plus:纯 Java AI 平台的集成实践
java·人工智能·agent
蜗牛互联网5 小时前
MongoDB Atlas Agent Engine之后,如何用版本门禁防止陈旧写入
java·数据库·人工智能·后端·mongodb
长弓三石5 小时前
企业级智能体的权限到底怎么落地?以 BizBuddy 为例
java·人工智能·agent
用户4270276726816 小时前
一次缓存优化:SQL 从 502 降到 5
java
2601_962885726 小时前
如何用 Python 做股价历史分位选股?(筛出处于历史低位的股票)
开发语言·python
小师兄吃牛肉6 小时前
C语言指针进阶全解析
java·c语言·算法
梦帮科技6 小时前
vLLM / TensorRT-LLM 极限推理:PagedAttention 细粒度物理页表管理与连续批处理(Continuous Batching)实战
数据结构·人工智能·分布式·python·深度学习·算法·vllm