堆----2.前 K 个高频元素

347.前 K 个高频元素 本题属于统计元素频率并找出高频元素的问题。可以通过统计每个元素的出现频率,然后根据频率对元素进行排序,最终找出前。个高频元素,最后将堆中的元素存入结果数组并返回。这个代码首先统计每个元素的出现频率,然后使用最小堆来维护前。,请你返回其中出现频率前。347.前 K 个高频元素。 阅读详情

347. 前 K 个高频元素 - 力扣(LeetCode)

/**

        桶排序:

                首先遍历数组,使用HashMap统计每个元素出现的次数

                创建一个大小为length + 1的List数组,下标代表元素出现次数,出现次数一致的元素放在同一个数组中

                倒数遍历List数组即可得得到前K个高频元素

        细节注意:

                长度为length的数组,可能存储的元素全部相同,则最高频元素出现次数为length

                下标代表频率即元素出现次数,则List数组大小需为length + 1

*/

class Solution {
    /**
        桶排序:
                首先遍历数组,使用HashMap统计每个元素出现的次数
                创建一个大小为length + 1的List数组,下标代表元素出现次数,出现次数一致的元素放在同一个数组中
                倒数遍历List数组即可得得到前K个高频元素
        细节注意:
                长度为length的数组,可能存储的元素全部相同,则最高频元素出现次数为length
                下标代表频率即元素出现次数,则List数组大小需为length + 1
    */
    public int[] topKFrequent(int[] nums, int k) {
        //统计元素出现次数
        Map<Integer,Integer> countMap = new HashMap<>();
        for(int num : nums) {
            countMap.put(num,countMap.getOrDefault(num,0) + 1);
        }

        //创建List数组,按照出现次数,将元素存入List数组中
        List<Integer>[] buckets = new ArrayList[nums.length + 1];
        for(int num : countMap.keySet()) {
            //读取当前num的频率
            int freq = countMap.get(num); 

            //将元素添加到对应的“频率桶中”
            if(buckets[freq] == null) {
                buckets[freq] = new ArrayList<>();
            }
            buckets[freq].add(num);
        }

        //倒序遍历频率桶收集结果
        int[] result = new int[k];
        int index = 0; //result填充位置

        for(int i = buckets.length - 1; i >= 0 && index < k; i--) {
            if(buckets[i] != null) {
                for(int num : buckets[i]) {
                    result[index] =  num;
                    index++;
                    if(index == k) {
                        break;
                    }
                }
            }
        }

        return result;
    }
}

前 K 个高频元素算法详解:思路、实现与优化 本文详细解析了求解“前 K 个高频元素”的高效算法。首先通过哈希表统计元素频率(O(n)),然后使用小根堆(O(m log k))筛选出Top K高频元素,整体复杂度远优于全排序。该方法兼具空间优化(仅维护k大小的堆)和时间效率(动态替换堆顶元素),适用于日志分析、热门统计等实际场景。文章还建议了极端场景下的优化方案(快速选择算法)和分布式扩展思路,提供了清晰的Java实现代码,帮助读者掌握这一经典算法问题的核心解法。 阅读详情

相关推荐

[C++][Leetcode][TopK]前K大问题+前K高频(堆+map)

前两天面试的时候,面试官问了前K大的问题:先是找前K大数,其次是前K高频数。按照面试官的思路一道一道展开~ 对总体过程中思考的知识点进行一个总结: 为什么快排常用? 在大规模数据的时候,快速排序只会线性增长,而堆排序增加幅度很大,会远远大于线性。 堆排序指针寻址会耗费很多时间,但是快速排序的话只是移动到前后位置。 参考博文为什么快排最好 介绍一下C++构造函数? 构造函数没有...

BRAVE_NO1的专栏 1078

【LeetCode Hot100 堆】第 K 大的元素、前 K 个高频元素

【LeetCode Hot100 堆】第 K 大的元素、前 K 个高频元素

Luo_LA的博客 1103

LeetCode Java堆347:前K个高频元素

此题目类似于一个经典题:在1000000个元素中选取出前100名 下面先对该经典题目做一下思路的分析,方便对LeetCode的题目做进一步的理解。 在N个元素中选出前M个元素 思路一、使用最小堆 使用优先队列来维护当前看到的的前M个元素。对N个元素从头到尾扫描遍历一次,再将当前的前M个元素放入优先队列中,每次看到一个新的元素如果该元素比优先队列中最小的元素还要大时候,接着就把优先队...

抛弃幻想,准备斗争 719

前k个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:k 的取值范围是 [1, 数组中不相同的元素的个数]题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。

Yyyyyyyyyyyyds的博客 898

多个MOS管并联应用场景的四大要点

动态运行时,阈值电压Vgsth最低的MOS管首先打开,最后关闭。这种MOS管一般会占据更多的开关损耗,并且在开关转换过程中,承担了更高的电应力。

VBsemi的博客 3753

修改串口服务器,串口虚拟化 | 串口服务器Nport 5630 设置

原标题:串口虚拟化 | 串口服务器Nport 5630 设置JZGKCHINA项目改造,客户需要对IFix4.5进行升级,并优化通讯,在不改变原来配置的基础上逐步进行替换。需要将IFix升级到IFix5.9,数据库升级为SQL Server 2016,客户现场使用的智能仪表都是支持Modbus RTU协议的,因原来的手拉手的通讯方式的,当一台仪表掉线后,会影响到其他仪表的通讯,所以此次在不改变原有...

weixin_31688465的博客 2408

前 K 个高频元素

也可以将自己写的struct的对象放进去。map的特性是map中的元素会按照键的顺序自动排序,但我们用priority_queue的第三个参数实现排序,此时map中的排序不是我们所需的,当然也可以自定义比较函数,但C++提供了更方便的数据类型,所以不用map。若用int来存储数据的频率,最终也能实现存前k个频率最大的元素,但问题是如何实现最终输出的效果为:首先输出频率最高的元素,如果频率相同,则先输出元素值较大的元素?使用map存储键值对,就可以很方便的实现数字与频率的对应,map里的术语是键与值的对应。

S_t_a_r_123的博客 1034

eNSP-交换机VLAN配置

VLAN

乌托托的博客 8809

【数据结构OJ】前K个高频单词

对于上图的两种情况,第二种情况的小根堆,在一系列后续操作后,得到的最终结果是是符合题目要求的排序条件的:所以,在minHeap.size()

OuO-1 的博客 1449

一个完整的c#股票分析软件源码

完整的c#股票分析软件源码

qq_35600909的博客 4595

如何学习总线技术

如何学习总线技术 以形象生动的比喻来描绘了总线技术的基本思想,指出了总线的基本分类和总线传输的基本原理,以及在学习过程中应当掌握的最基本的知识,对初学者有起到抛砖引入的作用。 0引言   如果一座只能容一个人来往的独木桥,两端的人都想要过桥,为了不拥挤、阻塞,那我们就得采取有效的办法。比如规定某段时间哪端的人过桥,另一端的人就等着该他过桥的时间段的到来,同时也还可以规定人多时要按先来后到或年

ce123的技术博客 8529

【leetcode】347. 前k个高频元素

这样堆中始终保存的是频率最高的 k 个元素。O(n log k):遍历 nums 中的 n 个元素,每次操作堆的时间复杂度为 O(log k),因此总时间复杂度为 O(n log k)。主要功能: 最小堆:heapq 默认实现的是最小堆(即堆顶是最小的元素)。最小堆的性质: 每个父节点的值都小于或等于其子节点的值,这使得堆顶元素始终是最小的元素。最小堆:通过 heapq 模块来实现最小堆,堆中存储的是 (频次, 数字) 元组。在 heapq 模块中,堆是用列表实现的,列表的第一个元素始终是堆顶元素。

qq_38473254的博客 1584

uniapp - 详解APP端免费人脸识别+人脸核身+人脸对比+活体检测插件功能完整源码,uniAPP纯前端实现不依赖后端API接口或第三方付费人脸识别功能示例(仅兼容安卓app与苹果ios App)

uniapp免费人脸认证功能,uniapp APP开发活体人脸识别,UniApp人脸识别与活体检测,人脸核身uni-app插件 活体检测 人脸对比 人脸识别 人脸认证 身份证件,uni-app人脸核身,如何在app端实现免费人脸识别教程,人脸核身uni-app插件活体检测,uniapp安卓ios百度人脸识别、活体检测、人脸采集APP原生插件,详细实现人脸识别和活体检测功能,实时监测人脸是否进入区域及动作是否正确播报,提供提供实名认证、身份证识别、有没有免费的,api,活体检测,人脸信息采集、刷脸扫脸认证示例

🏆 前端领域优质创作者 4386

347. 前 K 个高频元素

优先队列

底层码农 6198

热红外图像小目标检测算法综述

热红外小目标检测算法综述,着重介绍基于深度学习的小目标检测算法

Littro Innovations 4244

【2025软考高级架构师】论文篇——4、论可靠性系统中软件容错技术的应用

软件容错技术对软件的稳定性起着至关重要的作用,尤其是针对互联网性质的软件并发高存在流量峰值等问题,软件容错技术的应用的重要性就不言而喻了。经过这次我所采用的软件容错技术的方法和措施的实施效果后,使我也看到了自己身上的不足之处,我会在今后的架构设计过程中,不断更新自己的知识,不断完善自己的架构设计领域,设计出更好的软件架构,更好的支撑业务平台的运行,提高公司的竞争力,为公司为社会尽一份绵薄之力。

qq837993702的博客 619

LeetCode hot 100—前 K 个高频元素

给你一个整数数组nums和一个整数k,请你返回其中出现频率前k高的元素。你可以按返回答案。

rigidwill的博客 1107

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Leetcode 347. 前 K 个高频元素

Leetcode 347. 前 K 个高频元素1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/top-k-frequent-elements/   本质上就是一个 map使用的问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std;

珍惜 9212

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【中等】力扣算法题解析LeetCode347:前 K 个高频元素

LeetCode 347题「前K个高频元素」的解题思路与Java实现。题目要求在整数数组中找到出现频率最高的前k个元素,需满足时间复杂度优于O(n log n)。核心解法分三步:首先用哈希表统计元素频率,然后通过最小堆维护前k高频元素,最后输出结果。该方法时间复杂度为O(n log k),空间复杂度O(n)。

ylumwd的博客 1421

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

347.前k个高频元素——最小堆的运用

前k个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 提示: 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。

mirana的专栏 489

【347. 前 K 个高频元素 中等】

时间复杂度: O(nlogk)空间复杂度: O(n)堆是一个完全二叉树,其高度为 logk,其中k是堆中元素的数量。上浮调整的过程是从叶子节点向上到根节点的过程。在最坏情况下,新插入的元素需要一直上浮到根节点。因此,上浮调整的最坏情况时间复杂度是 O(logk)。

yuan_2001_的博客 1029
上一篇: 堆----1.数组中的第K个最大元素
下一篇: 堆----3.数据流的中位数
码破苍穹ovo
博客等级 码龄2年 377粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值