LeetCode--347.前k个高频元素(使用优先队列解决)

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

思路:先使用HashMap统计数组各个元素的个数,其中key代表数组元素,value代表元素出现的次数。然后使用队列进行map排序,排序是从大到小,选取前k个元素即为前k个高频元素

何为优先队列?

函数定义如下:

java 复制代码
public class PriorityQueue<E> extends AbstractQueue<E>
    implements java.io.Serializable {

JDK解释如下:

基于优先级堆的无限优先级队列。优先级队列的元素根据其自然 Sequences 进行排序,或者根据队列构造时提供的 进行排序Comparator(自定义排序规则),具体取决于使用的构造函数。优先级队列不允许null元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致 )。ClassCastException

代码及其解释:

java 复制代码
public int[] topKFrequent(int[] nums, int k) {
    // map中的key为数组元素,value为该元素出现的次数
    HashMap<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        if (map.containsKey(nums[i])) {
            map.put(nums[i], map.get(nums[i]) + 1);
        } else {
            map.put(nums[i], 1);
        }
    }
    // 优先队列,(o1, o2) -> map.get(o2) - map.get(o1) 升序排列
    PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> map.get(o2) - map.get(o1));
    // 遍历map,将元素放入优先队列中,会自动排序
    for (int i : map.keySet()) {
        queue.add(i);
    }
    int[] result = new int[k];
    for (int i = 0; i < k; i++) {
        result[i] = queue.poll();
    }
    return result;
}
相关推荐
E_ICEBLUE15 分钟前
Excel vs CSV:在系统数据处理中该如何选择?
java·excel·csv·格式转换
Word码15 分钟前
leetcode260.只出现一次的数字III
算法
MM_MS27 分钟前
Halcon图像采集助手、ROI操作和画图、ROI实现区域与轮廓之间的相互转换、区域的交集差集取反
图像处理·人工智能·数码相机·算法·目标检测·计算机视觉·视觉检测
智者知已应修善业43 分钟前
【输出一个N*N的01矩阵,表示最后的汉字点阵图】2024-10-22
c语言·数据结构·c++·经验分享·笔记·算法·矩阵
郑州光合科技余经理1 小时前
同城020系统架构实战:中台化设计与部署
java·大数据·开发语言·后端·系统架构·uni-app·php
uesowys1 小时前
华为OD算法开发指导-二级索引
数据结构·算法·华为od
LcVong1 小时前
Android 25(API 25)+ JDK 17 环境搭建
android·java·开发语言
a程序小傲1 小时前
高并发下如何防止重复下单?
java·开发语言·算法·面试·职场和发展·状态模式
uoKent1 小时前
c++中的封装、继承与多态
开发语言·c++·算法
爱喝可乐的老王1 小时前
机器学习监督学习模型--朴素贝叶斯
人工智能·算法·机器学习