【LeetCode-中等题】347. 前 K 个高频元素

2023-09-18 21:51:01

题目

在这里插入图片描述

方法一:优先队列(基于大顶堆实现)

PriorityQueue<int[]> queue = new PriorityQueue<>((a,b)->b[1]-a[1]);
优先队列 按照队列中的数组的第二个元素从大到小排序
((a,b)->b[1]-a[1])
在这里插入图片描述

class Solution {
    //基于大顶堆实现
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();//key为数组元素值,val为对应出现次数
        //在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数
        //出现次数按从队头到队尾的顺序是从大到小排,出现次数最多的在队头(相当于大顶堆)
        PriorityQueue<int[]> queue = new PriorityQueue<>((a,b)->b[1]-a[1]);

        for(int num : nums)
            map.put(num,map.getOrDefault(num,0)+1);

        //将map集合中的  key(num)  value(出现次数)  以数组的形式  a[key  ,  value]  加入到优选队列中  
        ///按照value从大到小的顺序进行排列
        for(Map.Entry<Integer,Integer> entry :map.entrySet())
            queue.add(new int[]{entry.getKey(),entry.getValue()});
        
        //取出优先队列(已经按照value按从大到小排序好了)排在前k位的(key)到结果数组
        int[] res = new int[k];
        for(int i = 0 ; i < k ; i++){
            res[i] = queue.poll()[0];
        }
        return res;
    }
}

方法二:优先队列(基于小顶堆实现,队列只需维护k个元素)

PriorityQueue<int[]> queue = new PriorityQueue<>((a,b)->a[1]-b[1]);
优先队列 按照队列中的数组的第二个元素从小到大排序
((a,b)->a[1]-b[1])
在这里插入图片描述

class Solution {
    //基于小顶堆实现
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();//key为数组元素值,val为对应出现次数
        //在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数
        //出现次数按从队头到队尾的顺序是从小到大排,出现次数最多的在队头(相当于大顶堆)
        PriorityQueue<int[]> queue = new PriorityQueue<>((a,b)->a[1]-b[1]);

        for(int num : nums)
            map.put(num,map.getOrDefault(num,0)+1);

        //将map集合中的  key(num)  value(出现次数)  以数组的形式  a[key  ,  value]  加入到优选队列中  
        ///按照value从大到小的顺序进行排列
        for(Map.Entry<Integer,Integer> entry :map.entrySet()){//小顶堆只需要维持k个元素有序
        //如果队列大小小于k  直接将 a[key  ,  value]加入队列
                if(queue.size() < k)  queue.offer(new int[]{entry.getKey(),entry.getValue()});
        //如果队列大小为k  则需要判断当前对列队首的数组  value(次数) 和 entry.getValue()对比  如果大于队首的value  则替换队首元素,否则不做改变
                else if(entry.getValue() > queue.peek()[1]){ 
                        queue.poll();
                        queue.offer(new int[]{entry.getKey(),entry.getValue()});
                }
        }

        int[] res = new int[k];
          //由于优先队列时小根堆,所以出现次数大的出现在队列对后面  需要逆序把队列中的key 放到结果数组中
        for(int i = k-1 ; i >=0 ; i--)
            res[i] = queue.poll()[0];
        
        return res;
    }
}
更多推荐

3D医学影像PACS系统源代码

一、系统概述3D医学影像PACS系统,它集影像存储服务器、影像诊断工作站及RIS报告系统于一身,主要有图像处理模块、影像数据管理模块、RIS报告模块、光盘存档模块、DICOM通讯模块、胶片打印输出等模块组成,具有完善的影像数据库管理功能,强大的图像后处理功能,提高了临床诊断准确率。二、三维影像重建支持三维影像处理功能;

代码签名:保护你的软件的安全性和完整性

代码签名是一种数字签名技术,用于保护软件的完整性和身份。它通过使用一个密钥对软件代码进行签名,确保代码在下载和安装过程中没有被篡改。代码签名证书是一种数字证书,用于证明代码签名者的身份和代码的完整性。以下是代码签名证书如何保护您的软件的详细说明:1,确保软件的完整性:代码签名证书可以确保您的软件在下载和安装过程中没有被

【cmake开发(5)】cmake 设置常规变量、环境变量、内置变量;cmake 带参数编译和 -D 选项; c++源码通过-D 选项的宏定义进行条件编译

文章目录一、CMake变量的定义1.1定义常规变量1.2打印变量1.3环境变量1.4持久缓存1.5持久缓存原理1.6内置变量二、带参数编译2.1我们可以看到了-D选项,一般配合option命令2.2c++源码通过-D选项的宏定义进行条件编译参考在【cmake开发(3)】中,我们设置了makeinstall安装目录。这就

「网页开发|后端开发|Flask」08 python接口开发快速入门:技术选型&写一个HelloWorld接口

本文主要介绍为网站搭建后端时的技术选型考虑,以及通过写一个简单的HelloWorld接口快速了解前端和后端交互的流程。文章目录本系列前文传送门一、场景说明二、后端语言技术选型三、后端框架技术选型Django特点Flask特点FastAPI特点Tarnado特点四、用Flask先来个最简单的HelloWorld五、在前端

静态代理和动态代理

一、静态代理代理模式(ProxyPattern)是一种结构型设计模式,它的概念很简单,它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个角色:代理角色和真实角色。代理类负责代理真实类,为真实类提供控制访问的功能,真实类则完成具体的业务逻辑。这样,当我们不方便或者不能直接访问真实对象时,可以通过代理对象来

Mysql----锁

文章目录锁概述全局锁全局锁概述全局锁操作表级锁表级锁表锁表级锁元数据锁表级锁意向锁行级锁行级锁行锁行级锁间隙锁&临键锁锁概述是什么是计算机协调多个进程或线程并发访问某一资源的机制。意义在数据库中,数据是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发

大数据之-Flink学习笔记

FlinkApacheFlink—数据流上的有状态计算。ApacheFlink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算处理。任何类型的数据都以事件流的形式生成。信用卡交易、传感器测量、机器日志或网站或移动应用程序2上的用户交互,所有这些数据都以流的形式生成。数据可以作为无界或有界流进行处理。无界

U盘格式化后数据能恢复吗?详细答案看这里!

“U盘格式化之后数据还可以恢复吗?这真的困扰了我好久!之前由于u盘中病毒,不得已将它格式化了,但是我还有好多视频、图片都保存在里面,这该怎么办呢?”小小的u盘,可是给我们带来了很多的便利的。在互联网时代,u盘的作用也是越来越大。但不否认的是,在使用u盘的过程中,我们也会遇到各种各样的问题,有时候我们不得已需要将u盘格式

基于PyTorch搭建FasterRCNN实现目标检测

基于PyTorch搭建FasterRCNN实现目标检测1.图像分类vs.目标检测图像分类是一个我们为输入图像分配类标签的问题。例如,给定猫的输入图像,图像分类算法的输出是标签“猫”。在目标检测中,我们不仅对输入图像中存在的对象感兴趣。我们还对它们在输入图像中的位置感兴趣。从这个意义上说,目标检测超越了图像分类。1.1图

Java实现敏感日志脱敏

一、前言在实际项目中,可能需要对日志中的一些敏感数据脱敏,比如使用遮掩算法,只显示部分数据。二、具体实现1.首先定义一个工具类,对常见的一些敏感数据脱敏publicclassDesensitizedUtils{/***【中文姓名】只显示第一个汉字,其他隐藏为2个星号,比如:李***/publicstaticString

Ubuntu 20.04中Nightingale二进制部署

参考博客《【夜莺监控】初识夜莺,强!》lsb_release-r可以看到操作系统版本是20.04,uname-r可以看到内核版本是5.5.19。sudoapt-getupdate进行更新镜像源。完成之后,如下图:sudoapt-getupgrade更新软件。MySQL安装参考博客《Ubuntu20.04安装MySQL8

热文推荐