DeepSeek LeetCode 347. 前 K 个高频元素 Java实现

发布时间:2026/10/23 7:54:12

DeepSeek    LeetCode 347. 前 K 个高频元素 Java实现 LeetCode 347. 前 K 个高频元素题目描述给你一个整数数组 nums 和一个整数 k请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]解法一小顶堆推荐最常用思路 先用 HashMap 统计频率然后维护一个大小为 k 的小顶堆。当堆大小超过 k 时弹出堆顶频率最小的元素最终堆中剩下的就是频率前 k 高的元素。classSolution{publicint[]topKFrequent(int[]nums,intk){// 1. 统计频率MapInteger,IntegerfreqnewHashMap();for(intnum:nums){freq.put(num,freq.getOrDefault(num,0)1);}// 2. 小顶堆按频率升序PriorityQueueint[]pqnewPriorityQueue((a,b)-a[1]-b[1]);for(Map.EntryInteger,Integerentry:freq.entrySet()){pq.offer(newint[]{entry.getKey(),entry.getValue()});if(pq.size()k){pq.poll();// 弹出频率最小的}}// 3. 收集结果int[]resnewint[k];for(intik-1;i0;i--){res[i]pq.poll()[0];}returnres;}}· 时间复杂度 O(n log k)· 空间复杂度 O(n)解法二桶排序最优O(n)思路 频率最大值不超过 n。创建 n1 个桶桶的下标为频率把相同频率的元素放进同一个桶。然后从高频桶向低频桶遍历取前 k 个元素。classSolution{publicint[]topKFrequent(int[]nums,intk){MapInteger,IntegerfreqnewHashMap();for(intnum:nums){freq.put(num,freq.getOrDefault(num,0)1);}// 桶下标为频率ListInteger[]bucketsnewList[nums.length1];for(Map.EntryInteger,Integerentry:freq.entrySet()){intfentry.getValue();if(buckets[f]null){buckets[f]newArrayList();}buckets[f].add(entry.getKey());}// 从高频到低频收集int[]resnewint[k];intidx0;for(intibuckets.length-1;i0idxk;i--){if(buckets[i]!null){for(intnum:buckets[i]){res[idx]num;if(idxk)break;}}}returnres;}}· 时间复杂度 O(n)· 空间复杂度 O(n)解法三快速选择Quickselect思路 把 (元素, 频率) 转成数组用快速选择找第 k 大的分割点平均 O(n)。classSolution{publicint[]topKFrequent(int[]nums,intk){MapInteger,IntegerfreqnewHashMap();for(intnum:nums){freq.put(num,freq.getOrDefault(num,0)1);}int[][]arrnewint[freq.size()][2];inti0;for(Map.EntryInteger,Integere:freq.entrySet()){arr[i]newint[]{e.getKey(),e.getValue()};}quickSelect(arr,0,arr.length-1,k);int[]resnewint[k];for(intj0;jk;j){res[j]arr[j][0];}returnres;}// 将前 k 大的元素无序放到数组前 k 位privatevoidquickSelect(int[][]arr,intleft,intright,intk){if(leftright)return;intpivotpartition(arr,left,right);intcountpivot-left1;// 左侧含 pivot的元素个数if(countk){return;}elseif(countk){quickSelect(arr,left,pivot-1,k);}else{quickSelect(arr,pivot1,right,k-count);}}// 按频率降序分区左侧频率 pivot 频率privateintpartition(int[][]arr,intleft,intright){int[]pivotarr[right];intileft;for(intjleft;jright;j){if(arr[j][1]pivot[1]){int[]tmparr[i];arr[i]arr[j];arr[j]tmp;i;}}int[]tmparr[i];arr[i]arr[right];arr[right]tmp;returni;}}· 时间复杂度 平均 O(n)最坏 O(n²)· 空间复杂度 O(n)对比总结解法 时间复杂度 空间复杂度 特点小顶堆 O(n log k) O(n) 最通用、面试首选k 较小时优秀桶排序 O(n) O(n) 最优时间思路直观快速选择 平均 O(n) O(n) 原地操作工程实现稍复杂面试建议 先写小顶堆版本思路清晰、不易写错再补充说明桶排序可以达到 O(n) 的优化思路。
延伸阅读

更多相关文章

2026/10/23 7:54:12

UE5魂系游戏开发教程05

本系列使用UE5.5.4第三人称模板进行制作,本文将讲述State组件的制作;以及RetriggerDelay蓝图节点使用,这是该教程的第五部分。1.在Blueprints文件夹下新建蓝图BP_State2.蓝图类型选择Actor Component3.创建好后如图4.双击打开该蓝图&#xff…

2026/10/23 8:44:22

桌面端实用工具怎么选?从效率软件到开源工具的全方位指南

1. 选题速览:为什么这个标题值得花5分钟桌面端实用工具是一个永远有热度的话题。不管是刚接触电脑的新手,还是每天跟文件、截图、窗口打交道的办公族,总在找一个更顺手的工具来提升效率。这个标题之所以值得花几分钟看,是因为它把…

2026/10/23 8:44:22

Spring AI Alibaba停更慌什么?Java企业级AI应用才是王道

Spring AI Alibaba停更了,Java还有希望吗?这段时间技术群里最躁动的话题,莫过于Spring AI Alibaba项目的停更传闻。消息一出,不少搞Java的朋友直接慌了神:“完了,Java在AI时代彻底掉队了”“赶紧转Python吧…

2026/10/23 8:44:22

Python消费SSE事件流:增量文本、超时控制与请求取消实战

最近不少用 Python 接大模型接口的朋友,都被 SSE(Server-Sent Events)的消费逻辑绊过一跤。尤其换到 Responses API 之后,交互方式从“一次性拿到完整 JSON”变成了“服务端一个事件一个事件往下推”,增量文本、连接超…

2026/10/23 8:44:22

Folia 下载与安装:从选对安装包到 5 分钟点亮全屏歌词

Folia 下载与安装:从选对安装包到 5 分钟点亮全屏歌词 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major Folia 是一款开源音乐播放器…

2026/10/23 8:39:18

slub track_item

定义分配/释放跟踪的枚举,以及 sysfs / debugfs 接口的编译期桩函数。一、跟踪项枚举enum track_item { TRACK_ALLOC, TRACK_FREE };配合上一段的 struct track 使用。SLUB 在开启 SLAB_STORE_USER 调试标志后,会在每个对象关联一个 struct track 数组&a…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑