1.题目描述

在这里插入图片描述

2.思路

在这里插入图片描述
在这里插入图片描述
(1)这里定义了一个小根堆(最小堆),根据元素的频率从小到大排序。小根堆原理:堆顶是最小值,每次插入或删除操作会保持堆的有序结构(常用二叉堆实现)。
比如,map.get(a) - map.get(b) 表示:
频率小的排在堆顶;
当堆满 k 个元素后,就可以比较新元素与堆顶的大小,进行替换。

(2)这个循环遍历 map 中的所有 key,目的是找出频率前 k 高的元素。

如果堆还没满,直接加入;
如果堆满了,比较当前元素的频率和堆顶元素频率:
当前元素更高,则替换堆顶。
继续例子(k = 2)
map: {1=3, 2=2, 3=1}
按顺序加入:
加入 1,堆 = [1]
加入 2,堆 = [1, 2](根据频率排序,2 的频率低,堆顶是 2)
处理 3(频率 1):
频率小于堆顶 2 → 不加入
最终堆中是 [1, 2]
在这里插入图片描述

🧩 举个例子来直观理解:
(1)输入:nums = [1, 1, 1, 2, 2, 3],k = 2
(2)频率统计结果:map = {1=3, 2=2, 3=1}
维护一个小根堆 pq,大小最多为 2(k=2):
加入 1(频率3)→ pq = [1]
加入 2(频率2)→ pq = [2, 1](按频率排序,堆顶是频率最小的)
尝试加入 3(频率1):
频率 1 < 堆顶 2 的频率 ⇒ 不加入
现在 pq 中是 [2, 1],是频率前 2 高的元素!
取出堆中元素:
int[] result = new int[k];
for (int i = 0; i < k; i++) {
result[i] = pq.remove(); // remove 堆顶元素
}
return result;
虽然 remove() 是按频率从小到大弹出,但我们关心的是内容是这 k 个元素本身是否是频率最高的
它不保证从大到小的顺序(如果你想要排好顺序,可以再排序)
总结这段逻辑:
小根堆始终维护的是「当前频率最高的前 k 个元素」;

取出这些元素即可完成任务;

堆顶是这 k 个元素中最小的,所以我们才用小根堆。

3.代码实现

class Solution {public int[] topKFrequent(int[] nums, int k) {//使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值HashMap<Integer, Integer> map = new HashMap<>();for (int num : nums) {if(map.containsKey(num)){//如果字典元素在后续遍历的过程中又再次出现,直接次数+1map.put(num, map.get(num) + 1);}else{//如果该字典元素是首次出现。map.put(num, 1);}}//遍历map,用最小堆保存频率最大的k个元素//优先级队列的底层原理就是堆PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {public int compare(Integer a, Integer b) {return map.get(a) - map.get(b);  // 出现次数小的排前面(小根堆)}});// 遍历 map 的 key 值for (Integer key : map.keySet()) {if (pq.size() < k) {pq.add(key);  // 队列还未满,直接加入} else if (map.get(key) > map.get(pq.peek())) {pq.remove();      // 弹出堆顶元素(频率最小)pq.add(key);      // 加入当前频率更高的元素}}//取出最小堆的元素int[] result=new int[k];for(int i=0;i<k;i++){result[i]=pq.remove();}return result;//pq.remove() 会返回堆顶元素,并从堆中删除该元素;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/908314.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/908314.shtml
英文地址,请注明出处:http://en.pswp.cn/news/908314.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VR/AR 显示瓶颈将破!铁电液晶技术迎来关键突破

在 VR/AR 设备逐渐走进大众生活的今天&#xff0c;显示效果却始终是制约其发展的一大痛点。纱窗效应、画面拖影、眩晕感…… 传统液晶技术的瓶颈让用户体验大打折扣。不过&#xff0c;随着铁电液晶技术的重大突破&#xff0c;这一局面有望得到彻底改变。 一、传统液晶技术瓶颈…

【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)

在使用ocrmypdf的时候&#xff0c;需要Ghostscript9.55及以上的版本&#xff0c;但是ubuntu自带为9.50 然后使用ocrmypdf报错了 sudo apt update sudo apt install ghostscript gs --version 9.50 #版本不够安装的版本为9.50不够&#xff0c;因此去官网https://ghostscript.c…

【TinyWebServer】线程同步封装

目录 POSIX信号量 int sem_init(sem_t* sem,int pshared,unsingned int value); int sem_destroy(sem_t* sem); int sem_wait(sem_t* sem); int sem_post(sem_t* sem); 互斥量 条件变量 为了对多线程程序实现同步问题&#xff0c;可以用信号量POSIX信号量、互斥量、条件变…

打造高效多模态RAG系统:原理与评测方法详解

引言 随着信息检索与生成式AI的深度融合&#xff0c;检索增强生成&#xff08;RAG, Retrieval-Augmented Generation&#xff09; 已成为AI领域的重要技术方向。传统RAG系统主要依赖文本数据&#xff0c;但真实世界中的信息往往包含图像、表格等多模态内容。多模态RAG&#xf…

Unity安卓平台开发,启动app并传参

using UnityEngine; using System;public class IntentReceiver : MonoBehaviour {public bool isVR1;void Start(){Debug.LogError("app1111111111111111111111111");if (isVR1){LaunchAnotherApp("com.HappyMaster.DaKongJianVR2");}else{// 检查是否有传…

云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】

云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】 目录 云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】1.RPM包的一般安装位置2.软件名和软件包名3.查询软件信息4.查询软件包5.导入红帽签名信息&#xff0c;解决查询软件包信息报错6.利用…

【图像处理3D】:点云图是怎么生成的

点云图是怎么生成的 **一、点云数据的采集方式****1. 激光雷达&#xff08;LiDAR&#xff09;****2. 结构光&#xff08;Structured Light&#xff09;****3. 双目视觉&#xff08;Stereo Vision&#xff09;****4. 飞行时间相机&#xff08;ToF Camera&#xff09;****5. 其他…

javaweb -html -CSS

HTML是一种超文本标记语言 超文本&#xff1a;超过了文本的限制&#xff0c;比普通文本更强大&#xff0c;除了文字信息&#xff0c;还可以定义图片、音频、视频等内容。 标记语言&#xff1a;由标签"<标签名>"构成的语言。 CSS:层叠样式表&#xff0c;用于…

pyinstaller 安装 ubuntu

安装命令 pip install pyinstaller 读取安装路径 ➜ ~ find ~/.local/ -name pyinstaller/home/XXX/.local/bin/pyinstaller 路径配置 vi ~/.zshrc 添加到文件最后 export PATH"$PATH:/home/XXX/.local/bin/" 查看版本号 ➜ ~ source ~/.zshrc➜ ~ pyi…

【前端】掌握HTML/CSS宽高调整:抓住问题根源,掌握黄金法则

一、宽高控制的「黄金法则」 问题根源&#xff1a;为什么设置了宽高没效果&#xff1f; <!-- 典型失败案例 --> <style>.problem-box {width: 200px;height: 100px;padding: 20px; /* 实际变成240x140px&#xff01; */border: 5px solid red; /* 最终250x150px&…

LuaJIT2.1 和 Lua5.4.8 性能对比

说明 最近在学习 LuaJIT&#xff0c;想看看把它接入到项目中使用&#xff0c;会提高多大的性能。 今天抽时间&#xff0c;简单地测试了一下 LuaJIT 2.2 和 Lua5.4.8 的性能。 测试平台&#xff1a; 系统&#xff1a;Windows 10 WSLCPU&#xff1a;Intel Core™ i7-8700 CPU…

Arduino学习-按键灯

哎&#xff0c;别笑&#xff0c;总比刷抖音强点吧 1、效果 2、代码 const int buttonPin2; const int ledPin13;int buttonState0;void setup() {// put your setup code here, to run once:pinMode(buttonPin,INPUT);pinMode(ledPin,OUTPUT); }void loop() {// put your mai…

强化学习鱼书(10)——更多深度强化学习的算法

&#xff1a;是否使用环境模型&#xff08;状态迁移函数P(s’|s,a)和奖 励函数r(s&#xff0c;a&#xff0c;V)&#xff09;。不使用环境模型的方法叫作无模型&#xff08;model-free&#xff09;的方法&#xff0c;使用环境模型的方法叫作有模型&#xff08;model-based&#…

9.axios底层原理,和promise的对比(2)

&#x1f63a;&#x1f63a;&#x1f63a; 和promise的对比 完全可以直接使用 Promise 来发 HTTP 请求&#xff0c;比如用原生 fetch Promise 就可以实现网络请求功能&#x1f447; ✅ 用 Promise fetch 的写法&#xff08;原生&#xff09; fetch(‘https://api.example.c…

什么是数据孤岛?如何实现从数据孤岛到数据共享?

目录 一、数据孤岛是什么&#xff1f; &#xff08;一&#xff09;数据孤岛的定义 &#xff08;二&#xff09;数据孤岛怎么形成的 二、数据孤岛带来的问题 &#xff08;一&#xff09;数据冗余和不一致 &#xff08;二&#xff09;决策效率低下 &#xff08;三&#xf…

MQTT入门实战宝典:从零起步掌握物联网核心通信协议

MQTT入门实战宝典&#xff1a;从零起步掌握物联网核心通信协议 前言 物联网时代&#xff0c;万物互联已成为现实&#xff0c;而MQTT协议作为这个时代的"数据总线"&#xff0c;正默默支撑着从智能家居到工业物联的各类应用场景。本文将带你揭开MQTT的神秘面纱&#…

I2C通信讲解

I2C总线发展史 怎么在一条串口线上连接多个设备呢&#xff1f; 由于速度同步线是由主机实时发出的&#xff0c;所以主机可以按需求修改通信速度&#xff0c;这样在一条线上可以挂接不同速度的器件&#xff0c;单片机和性能差的器件通信&#xff0c;就输出较慢的脉冲信号&#x…

Windows 10 IoT 系统深度定制指南:从环境搭建到工业部署

目录 一、Windows 10 IoT 架构特性与版本选型 1.1 核心架构设计 1.2 版本对比与选型建议 二、开发环境搭建与硬件适配 2.1 工具链配置 2.2 硬件适配关键步骤 三、系统定制流程详解 3.1 镜像定制&#xff08;IoT Core Dashboard&#xff09; 3.2 使用ICD&#xff08;Im…

k8s开发webhook使用certmanager生成证书

1.创建 Issuer apiVersion: cert-manager.io/v1 kind: Issuer metadata:name: selfsigned-issuernamespace: default spec:selfSigned: {}2.Certificate&#xff08;自动生成 TLS 证书&#xff09; apiVersion: cert-manager.io/v1 kind: Certificate metadata:name: webhook…

MyBatis-Plus深度全解:从入门到企业级实战

MyBatis-Plus深度全解&#xff1a;从入门到企业级实战 一、为什么选择MyBatis-Plus&#xff1f; 1.1 MyBatis的痛点 - 重复CRUD代码编写 - 分页功能实现复杂 - 缺少通用Service层封装 - 动态表名支持困难 - 多租户方案需自行实现1.2 MyBatis-Plus核心优势 无侵入&#xff1a…