news 2026/8/16 17:04:39

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/8/16 3:59:13

luogu填坑

我一开始的思路&#xff1a;从1开始遍历&#xff0c;比如样例中&#xff0c;4>0那么开始往她后面寻找不等于0的道路一起-1&#xff0c;计为一次cnt1#include<stdio.h> int main(){int n;int str[10008];scanf("%d",&n);for(int i0;i<n;i){scanf(&quo…

作者头像 李华
网站建设 2026/8/13 5:08:43

Kubernetes API Server 深度解析与生产实践全指南

Kubernetes API Server 深度解析与生产实践全指南 Kubernetes 的核心是 API Server(kube-apiserver),它是集群操作的唯一入口。无论是内部组件(如 kubelet、scheduler)还是外部用户(如 kubectl 命令),所有请求都必须通过 API Server。可以把它理解为 Kubernetes 的“大…

作者头像 李华
网站建设 2026/8/16 7:35:00

day35打卡

浙大疏锦行

作者头像 李华
网站建设 2026/8/12 17:58:31

走向场景,走向融合:2025年末国产大模型的平台化竞赛与Agent新范式

目录 1 写作口径与方法&#xff1a;只谈“2025年12月仍在主推/可用”的国产大模型 1.1 为什么必须卡在“2025年12月最新”这个时间点 1.2 “不出现老旧模型”的执行标准 2 2025年末国产大模型的共同转向&#xff1a;从“会写”到“会做” 2.1 语言大模型正在变成“推理与执…

作者头像 李华