news 2026/7/25 0:05:07

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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个出现频率最高的元素。这种方法利用了哈希映射和桶排序将大量数据组织成更易处理或可视化的块的方法。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 20:38:54

写论文软件哪家强?别再只盯 “生成速度”!我们用一份被导师退回 3 次的初稿,实测哪款工具真能帮你改到位

“选题空洞、逻辑混乱、引用不规范、论证无力”—— 这是经管类本科生小周的论文《数字经济赋能乡村振兴》收到的 3 次退稿核心意见。这份初稿和多数学生的作品一样&#xff1a;框架松散&#xff0c;章节衔接生硬&#xff1b;文献堆砌无分析&#xff0c;30% 引用无法检索&#…

作者头像 李华
网站建设 2026/7/24 9:06:57

AI论文工具怎么选?6款详细对比+2025年推荐清单

毕业季近在眼前&#xff0c;论文查重和AI痕迹检测的压力让你头疼不已&#xff1f;别慌&#xff01;作为亲身测试过多款AI论文工具的博主&#xff0c;我明白那种选择恐惧症——工具太多&#xff0c;功能眼花缭乱&#xff0c;选不对就白费功夫。今天&#xff0c;我就带大家走进20…

作者头像 李华
网站建设 2026/7/22 13:21:47

高性能音频处理:深入解析无锁环形缓冲区 (Lock-Free Ring Buffer)

高性能音频处理&#xff1a;深入解析无锁环形缓冲区 (Lock-Free Ring Buffer) 在实时音频处理领域&#xff0c;性能和低延迟是至关重要的。传统的互斥锁&#xff08;Mutex&#xff09;虽然能保证线程安全&#xff0c;但在高并发或实时性要求极高的场景下&#xff0c;锁竞争导致…

作者头像 李华
网站建设 2026/7/23 17:04:08

GPT5.2有哪些最新优势特点?10000字长文带您了解

目录 0 先把名词对齐&#xff1a;你说的“ChatGPT5.2”到底指什么&#xff1f; 1 最直观的“用户侧优势”&#xff1a;更像把工作交付物一次做完 1.1 对“专业知识工作”的提升不是一句口号&#xff1a;官方拿 GDPval 作为主证据 1.2 在 ChatGPT 里&#xff0c;你会更明显感…

作者头像 李华