news 2026/9/2 14:38:47

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/9/2 21:27:24

前端农业商城中产品产地溯源功能的实现

一、需求分析&#xff1a;溯源功能的核心价值在项目开始前&#xff0c;我们明确了溯源功能的三个核心目标&#xff1a;信任建立 - 通过透明化供应链增强消费者信心体验提升 - 提供直观、有趣的农产品旅程可视化营销增值 - 将溯源过程转化为产品卖点二、技术架构设计前端技术栈选…

作者头像 李华
网站建设 2026/9/3 5:08:02

AI之LLMs:当 AI 成为常驻合作者—AI 让我们做更多,也让我们担心更多:Anthropic 的使用数据与体验洞察—Claude 在岗位上的影响(产能、技能与协作的双刃剑)

AI之LLMs&#xff1a;当 AI 成为常驻合作者—AI 让我们做更多&#xff0c;也让我们担心更多&#xff1a;Anthropic 的使用数据与体验洞察—Claude 在岗位上的影响(产能、技能与协作的双刃剑) 导读&#xff1a;Anthropic的这项内部研究提供了一个独特而深入的视角&#xff0c;揭…

作者头像 李华
网站建设 2026/9/2 21:33:05

从对话演示到智能工作平台:ChatGPT的三年演进史(2022-2025)

1 从“对话演示”到“通用入口”&#xff1a;ChatGPT 的起点与早期定位&#xff08;2022 年 11–12 月&#xff09; 1.1 2022 年底的 ChatGPT&#xff1a;并不是“一个模型”&#xff0c;而是一种交互范式 回到 2022 年 11 月 30 日&#xff0c;OpenAI 把“ChatGPT”推向公众…

作者头像 李华