当前位置: 首页 > news >正文

LeetCode热题100--347. 前 K 个高频元素--中等

题目

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

示例 1:

输入:nums = [1,1,1,2,2,3], k = 2

输出:[1,2]

示例 2:

输入:nums = [1], k = 1

输出:[1]

示例 3:

输入:nums = [1,2,1,2,1,2,3,1,3,2], k = 2

输出:[1,2]

题解

classSolution{publicint[]topKFrequent(int[]nums,intk){// 第一步:统计每个元素的出现次数Map<Integer,Integer>cnt=newHashMap<>();for(intx:nums){cnt.merge(x,1,Integer::sum);// cnt[x]++}intmaxCnt=Collections.max(cnt.values());// 第二步:把出现次数相同的元素,放到同一个桶中List<Integer>[]buckets=newArrayList[maxCnt+1];Arrays.setAll(buckets,_->newArrayList<>());for(Map.Entry<Integer,Integer>e:cnt.entrySet()){buckets[e.getValue()].add(e.getKey());}// 第三步:倒序遍历 buckets,把出现次数前 k 大的元素加入答案int[]ans=newint[k];intj=0;for(inti=maxCnt;i>=0&&j<k;i--){// 注意题目保证答案唯一,一定会出现某次循环结束后 j 恰好等于 k 的情况for(intx:buckets[i]){ans[j++]=x;}}returnans;}}

解析

出自:桶排序,O(n) 线性做法(Python/Java/C++/Go/JS/Rust)

classSolution{publicint[]topKFrequent(int[]nums,intk){// 定义主函数topKFrequent接受两个参数,整型数组和整数kMap<Integer,Integer>cnt=newHashMap<>();// 创建HashMap cnt用于存储每个数字的出现次数。这相当于C++中的unordered_map<int, int>for(intx:nums){// 遍历nums数组,统计其中每个元素(整型变量x)的频率cnt.merge(x,1,Integer::sum);// HashMap中的合并操作。如果键x存在,则将与其关联的值增加1;否则创建一个新条目并将其初始化为整数1。这相当于C++中的unordered_map[x]++或cnt[x] = cnt[x] + 1}// 如果不使用merge函数,我们需要先检查键是否存在然后再增加计数intmaxCnt=Collections.max(cnt.values());// 计算出现次数最大的元素的频率List<Integer>[]buckets=newArrayList[maxCnt+1];// 声明并初始化一个ArrayList数组buckets,用于存储有序号(计数)的列表。这相当于C++中的vector<list<int>> buckets(max + 1)Arrays.setAll(buckets,_->newArrayList<>());// 对每个桶进行初始化,以便将其转换为ArrayList对象。这等价于C++中对每个buckets[i] = new ArrayList()的操作for(Map.Entry<Integer,Integer>e:cnt.entrySet()){// 遍历HashMap cntbuckets[e.getValue()].add(e.getKey());// 将出现次数为e.getValue()的元素添加到buckets中相应位置的列表中。这相当于C++中的“桶排序”或使用索引来将计数映射到该计数对应集合中的项}// e是一个对象,用于获取键值和值int[]ans=newint[k];// 定义长度为k的整型数组ans以存储答案intj=0;// 初始化j为0for(inti=maxCnt;i>=0&&j<k;i--){// 反向遍历buckets数组。这相当于从出现次数最大的计数开始,直到0(包括零)以i递增的方式来减小i直到0for(intx:buckets[i]){// 对于每个桶中的元素xans[j++]=x;// 将x添加到ans中。这相当于在答案数组的第j个位置上放入此数字}// 然后递增计数器j,直到达到所要求的大小k}// 这种方法确保出现次数最多的元素首先被考虑(因为我们在反向遍历buckets)。当找到答案时退出循环以避免越界情况并遵守k的限制条件returnans;// 返回整型ans数组,其中包含前k个出现频率最高的数字}// 由于问题保证存在这样的答案,代码不必检查j是否等于k。该方法的时间复杂度为O(n),空间复杂度也为O(n),其中n是输入的大小。}// 因为需要保存所有元素的计数来构建桶排序,并最终构造答案数组前k个出现频率最高的元素。这种方法利用了哈希映射和桶排序将大量数据组织成更易处理或可视化的块的方法。
http://www.jsqmd.com/news/84678/

相关文章:

  • LLMs之RAG:《Meta-Chunking: Learning Text Segmentation and Semantic Completion via Logical Perception》翻
  • 告别开题报告模板拼凑!虎贲等考 AI 智能生成,让选题逻辑从模糊想法变身可执行研究计划
  • 高性能音频处理:深入解析无锁环形缓冲区 (Lock-Free Ring Buffer)
  • AI之Tool:Next AI Draw.io的简介、安装和使用方法、案例应用之详细攻略
  • Windows右键菜单终极优化指南:ContextMenuManager完全使用手册
  • LLMs之Agent:《Agent S: An Open Agentic Framework that Uses Computers Like a Human》翻译与解读
  • AI如何帮你快速解决.NET Framework 3.5安装问题
  • C 标准库 - <locale.h>
  • tar -czvf vs 其他压缩工具:效率对比
  • MLMs之GPT-5:OpenAI 发布 GPT-5.2 — 深入解析性能、编码与视觉能力的升级—面向专业工作的长上下文与工具调用飞跃—如何在长文档、智能体与代码工作流中部署
  • 单片机芯片] CH32V307 支持手机的虚拟U盘实现拖拽固件升级
  • 什么是可信计算?如何在可信计算中加入RFID
  • 4.1.17.1.MYSQL基础
  • 4.1.17.2.存储引擎
  • 【规范驱动的开发方式】之【spec-kit】 的安装入门指南
  • 基于ipsec的医院网络规划设计与实现
  • 【数学 | 大学数学 | 考研数学 | 计算机】线性代数 | 矩阵论
  • 微信小程序开发实战之 01-微信小程序入门
  • Scarab模组管理器:3分钟搞定空洞骑士MOD安装的智能解决方案
  • 2025年论文写作必备:实测6款AI工具后的良心推荐
  • neural network中的loss function (一)
  • 电商评论分析实战:Java + NLP 大模型,从 10 万条评论中自动提取“用户槽点”
  • AI论文工具怎么选?6款详细对比+2025年推荐清单
  • 从对话演示到智能工作平台:ChatGPT的三年演进史(2022-2025)
  • 8 分层架构核心原则
  • 缺少libgcc_s_seh-1.dll
  • 陪诊陪护小程序系统上门陪护代挂号排队跑腿买药陪诊php开发原生微信小程序系统
  • 走向场景,走向融合:2025年末国产大模型的平台化竞赛与Agent新范式
  • 多模态学习架构
  • GPT5.2有哪些最新优势特点?10000字长文带您了解