news 2026/7/7 19:56:00

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/7 9:46:50

java学习--8个包装类

Java 中的8 个包装类&#xff08;Wrapper Class&#xff09; 是为了解决基本数据类型无法直接参与面向对象编程&#xff08;如不能作为集合元素、无法调用方法&#xff09;的问题&#xff0c;为每个基本数据类型提供了对应的引用类型。以下是完整的 8 个包装类详解&#xff1a;…

作者头像 李华
网站建设 2026/7/7 2:04:12

单片机芯片] CH32V307 支持手机的虚拟U盘实现拖拽固件升级

看到虚拟优盘进行拖拽升级后&#xff0c;我也进行了几天测试尝试&#xff0c;终于还是找到了方法&#xff0c;能够在手机也能升级。模拟优盘主要是向电脑发送DBR表&#xff0c;DBR(DOS Boot Record)&#xff1a;磁盘操作系统引导记录&#xff0c;DBR是每个逻辑分区的一个引导记…

作者头像 李华
网站建设 2026/7/7 0:31:06

SK海力士×NVIDIA联手,AI NAND性能狂飙30倍!

2025年12月,SK海力士副社长Kim Cheon-sung在“2025人工智能半导体未来技术会议(AISFC)”上的表态,为AI存储领域投下了一颗重磅炸弹——与NVIDIA联合开发的下一代AI NAND(AI-N P)将于2026年底推出样品,性能达现有企业级SSD的8-10倍;2027年底量产的第二代产品更将实现30倍…

作者头像 李华
网站建设 2026/7/7 12:56:05

LeetCode046全排列

题目:给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]java:public class Leetcode046 {static List<List<Integer>> res new ArrayList<>();static LinkedLis…

作者头像 李华
网站建设 2026/7/7 9:45:32

缺少libgcc_s_seh-1.dll

缺少libgcc_s_seh-1.dll原因&#xff1a; 1.GCC运行时库缺失 libgcc_s_seh-1.dll是GCC编译器&#xff08;如MinGW-w64&#xff09;的核心运行时库&#xff0c;用于处理异常处理和基本运算。若目标电脑未安装GCC或相关工具链&#xff08;如MinGW&#xff09;&#xff0c;该文件会…

作者头像 李华