【LeetCode347】前k个高频元素

告别抓瞎!手把手教你用Keysight Infinium和M8040完成PCIe 5.0 TX/RX信号完整性测试 本文详细介绍了如何使用Keysight Infinium示波器和M8040误码仪完成PCIe 5.0 TX/RX信号完整性测试。从测试前的设备准备、软件配置到具体的TX信号测试步骤和RX容限测试实战,提供了全面的操作指南和常见问题解决方案,帮助工程师高效完成PCIe 5.0合规性测试。 阅读详情

题目描述

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

思路

  1. 统计元素的频率:使用 collections.Counter 来统计数组中每个元素出现的频率
  2. 获取前 k 个频率最高的元素
    优先队列(堆):一个常见的方法是使用 最小堆(heapq)。最小堆能够在 O(log n) 的时间复杂度内进行插入和删除操作。我们可以将元素和频率作为元组存入堆中。
    通过堆来获取频率前 k 高的元素。

代码

from collections import Counter
import heapq

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        # 1、统计频数
        count = Counter(nums)

        # 2、使用堆来寻找频率前k的元素
        # heapq.nlargest 返回的是一个包含元组的列表
        # 通过列表推导式 [item[0] for item in ...] 提取出频率前 k 高的元素
        # count.items() 返回一个元组的列表,每个元组包含一个元素及其频率。
        # 参数 key=lambda x: x[1] 意味根据元组的第二个元素(即元素的频率)进行排序
        return [item[0] for item in heapq.nlargest(k, count.items(), key = lambda x : x[1])]

总结

通过 heapq.nlargest 可以很方便地找到前 k 大的元素,堆的大小始终保持为 k。
通过使用堆来处理问题,而不是直接排序,能够避免 O(n log n) 的时间复杂度,提升到 O(n log k),其中 k 通常比 n 要小很多,因此能够有效提高效率。

堆的基础知识

堆是一种特殊的二叉树,但它不仅仅是任何树——它具有一个特定的属性:
最大堆:在最大堆中,每个父节点的值都大于或等于其子节点的值。因此,最大元素总是位于根节点。
最小堆:在最小堆中,每个父节点的值都小于或等于其子节点的值。因此,最小元素总是位于根节点
堆排序(以最大堆为例)主要分为两个步骤:

  1. 我们从最后一个非叶子节点(至少有一个子节点的节点)开始,并对其进行堆化。堆化意味着确保以该节点为根的子树遵循堆属性。重复这个过程,直到整个数组变成一个有效的最大堆。
  2. 从堆中提取最大元素:
    构建最大堆后,最大的元素位于堆的根部。
    我们将根元素(最大元素)与数组的最后一个元素交换。
    然后,我们从堆中移除最后一个元素(因为它已经在正确的位置上)。
    交换后,我们再次对根进行堆化,以恢复最大堆属性,因此下一个最大元素移动到根部。
    我们重复这个过程,直到没有更多的元素需要堆化。

堆在本题情景下的巧妙应用:避免 O(n log n) 的时间复杂度,提升到 O(n log k)

最小堆的关键属性是它可以在根节点保持最小元素,这允许我们高效地添加新元素和移除最小元素。
要找到 k 个最大的元素:

  1. 遍历大小为 n 的数组。对于每个元素,将其插入堆中。
  2. 如果堆超过 k 个元素,移除根节点(最小元素)。
  3. 插入每个元素需要 O(log k) 时间。对所有 n 元素执行此操作的时间复杂度为 O(n log k)。
【unity实战】随机地下城生成3——设置人物移动脚本、动画的切换和摄像机的跟随(含源码) 给房间添加触发器碰撞体,用来判断角色是否进入房间切割人物图片,注意人物每个图片高度可能不同,所有我们需要把轴心调整到人物的底部把人物跑步图片的高度,统一调成20,下面镂空,达到跳跃的效果快速创造人物动画,以人物idle为例,我们选中所有的idle人物图片,拖拽至窗口,unity就会自动生成,并提示保存动画位置别忘记设置人物排序图层,运行人物就动起来了新增run动画设置人物碰撞体设置刚体将重力设置为0,持续人物移动和动画切换的代码设置摄像机跟随单例代码在room中调用。 阅读详情

相关推荐

从‘数字分身’到‘数字员工’:华为云MetaStudio如何重塑企业生产力?

本文探讨了华为云MetaStudio如何通过数字人技术重塑企业生产力,从数字分身到数字员工的转变。通过多模态AIGC技术,MetaStudio在金融、零售和制造业等多个行业实现高效应用,显著提升服务质量和运营效率。数字员工不仅降低成本,更成为企业增长的新引擎。

weixin_29083475的博客 450

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

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

ylumwd的博客 1421

自动化测试软件设计:C# + VISA 库实现多接口(GPIB/USB)测试仪器控制

本文介绍了如何利用C#和VISA库开发支持多接口的自动化测试软件。VISA库作为标准化API,能够统一控制GPIB、USB等不同接口的测试设备。文章详细阐述了软件设计目标,包括多接口支持、统一控制、自动化脚本执行等功能。重点讲解了C#中VISA库的安装配置,并提供了设备控制类的核心代码实现,涵盖设备连接、命令发送、响应读取等关键操作。通过具体示例展示了GPIB和USB设备的连接方式,并扩展了自动化测试脚本功能。该方案具有高扩展性和维护性,适用于电子设备测试、生产线检测等多种场景,为自动化测试系统开发提供了实

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1710

力扣347:前k个高频元素---leetcode347:Top K Frequent Elements

力扣347:前k个高频元素---leetcode347:Top K Frequent Elements 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

xxxnnn1991的博客 393

使用Python开发TreeATE的测试脚本常见问题

ImportError: No module named py_compile 找不到 DevLangPython3.dll 以上2个问题都是没有安装正确的Python,当前TreeATE依赖32位Python 2.7版本,暂时不支持Python 3以上版本

蓝白云的专栏 1032

VSCODE编辑+EIDE插件调试+STM8_Debug插件调试+IAR_STM8工具链编译开发项目

1. 安装 在VS CODE安装EIDE、STM8-Debug插件 2. 使用 EIDE 创建一个 8/16 Bit MCU 项目 新建虚拟文件夹,把工程外部的文件添加进虚拟文件夹,实现工程和源文件之间的关系,而不用实际把源文件复制到工程目录下。 EIDE工程和源文件实现分开放置,EIDE(EIDE工程)、EWSTM8(IAR STM8工程)、Project(ST Visual Develop工程) 选择工具链 烧录工具选择 头文件包含目录 添加宏定义 3. 编译 4. 使用STM8

TrueLink的博客 5500

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

做蛋白组学数据分析,竟然还不会使用DIA-NN软件,走过路过不要错过,进来免费学习!!!

蛋白组学分析工具DIA-NN使用

wcy1995427的博客 9865

LeetCode刷题——347. 前 K 个高频元素

✊✊✊🌈大家好!本篇文章将较详细介绍栈的题目347.前 K 个高频元素,主要记录小顶堆的使用方式,代码语言为:C++代码😇。

君莫笑lucky的博客 845

2026年瑞芯微数字IC设计笔试试卷带答案

本文主要考察数字集成电路设计相关知识,包括低功耗设计、时序分析、跨时钟域处理、总线协议等内容。试题分为单选题、多选题、代码设计题和简答题四部分。 单选题涉及门控时钟降低动态功耗、静态时序分析的限制、跨时钟域同步方案、时序违例修复方法、AHB总线信号、异步FIFO设计、半导体工艺电阻特性、二进制数转换、同步/异步复位比较以及分频电路设计等知识点。 多选题重点考查动态功耗优化技术、亚稳态特性、异步FIFO设计规范、Verilog可综合代码编写要求以及AXI总线协议特点等。 代码设计题要求实现一个同步FIFO和3

Open 215

基于大语言模型的多轮对话系统优化研究

基于大语言模型的多轮对话系统优化研究 摘要 本研究针对大语言模型在多轮对话场景中的性能衰减问题,提出了一套系统优化方案。通过分层存储架构(短期记忆层、中期摘要层、长期知识层)和混合检索策略优化上下文管理,设计动态槽位填充框架增强对话状态跟踪,引入熵引导的重置算法改进生成策略,并采用双路径加载架构突破I/O瓶颈。实验表明,该方案使任务完成率提升28.6%,响应一致性提高41.2%,推理延迟降低35.8%,为构建高性能智能对话系统提供了实用技术路径。 关键词:大语言模型;多轮对话;上下文管理;状态跟踪~~~~~

huanghm88的专栏 663

LeetCode347. 前 K 个高频元素

LeetCode347. 前 K 个高频元素

Love Peace 1109

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

qq_38473254的博客 1584

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LeetCode第347题_前K个高频元素

LeetCode 347题解:前K个高频元素 本文提供两种高效解法: 优先队列法(O(nlogk)):使用哈希表统计频率,小顶堆维护前K元素 桶排序法(O(n)):构建频率桶,从高到低收集结果 核心思路: 统计元素频率 优先队列动态维护K个最大值 桶排序避免完全排序 代码实现: 包含C#、Python、C++三种语言版本,均通过测试用例。 性能对比: 桶排序法时间复杂度更优,适合大数据量场景;优先队列法实现更简洁。

qq_40263592的博客 1526

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【LeetCode: 347. 前 K 个高频元素 + 桶排序】

【LeetCode: 347. 前 K 个高频元素 + 桶排序】给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

Coder_ljw的博客 1170

LeetCode347 前K个高频元素解题思路与实现

本文分析了LeetCode 347题"前K个高频元素"的三种解法:大顶堆、小顶堆和桶排序。大顶堆实现简单但效率较低(O(n log n));小顶堆优化空间复杂度(O(n+k)),适合k较小场景;桶排序最优(O(n)),但需预知最大频率值。文章详细对比了三种方法的时间/空间复杂度及适用场景,并提供了完整代码实现。在实际应用中应根据数据规模、k值大小和频率分布特征选择合适解法。

m0_74696257的博客 1155

LeetCode 347 前 K 个高频元素

LeetCode 347 前 K 个高频元素 题目链接 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 简单数据结构,AC代码如下: class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k)

旺崽的博客 2643

【力扣347前k个高频元素】

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。输入: nums = [1,1,1,2,2,3], k = 2。输入: nums = [1], k = 1。

qq_51931826的博客 289

LeetCode 347 前K个高频元素 Java

LeetCode 347 前K个高频元素 Java题目描述代码 题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 说明: 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法...

qq_29061435的博客 133

【LeetCode】347.前 K 个高频元素

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

Leonardo_t的博客 608

golang力扣leetcode 347.前K个高频元素

347.前K个高频元素347.前K个高频元素题解代码 347.前K个高频元素 347.前K个高频元素 题解 题目:给一个数组,统计出现频率前k高的元素 思路: 1. 将元素和出现次数存入map 2. 快排出现次数 1.堆排序,小根堆 2.当堆中的元素大于k时,弹出堆顶,因为是小根堆,所有弹出的都是最小的出现次数 3.那么剩余堆中的k个元素就是出现频率前k高的元素了 注意Pop,我之前一直以为Pop是弹出末尾的元素,类似队列,结果Pop是弹出堆顶元素,并维护堆,那么对于小根堆来说,Pop就是弹出最小的元素

清风 659

LeetCode-347-前K个高频元素-C语言

/* * 算法思想: * 构建带权值哈希表,权值为出现次数; * 1. 首先排序,方便构建哈希表,使相同的值相邻; * 2. 排序哈希表,以哈希表的权值出现次数为排序元素; * 3. 从哈希表中提取k个排序结果即可。 **/ int cmp(int *a, int *b){ return *a - *b; } int cmp_node(int *a, int *b){ ...

SFFS 1246

LeetCode 347:前k个高频元素

LeetCode 347:前k个高频元素题目描述解题思路代码实现总结 题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 说明: 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你...

香农三定律的博客 237

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

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。提示:题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。小结:题目思路比较简单,难点在于优先级队列的使用和Map的遍历。

weixin_46878941的博客 1108

[LeetCode]day34 347.前k个高频元素

在小顶堆中,每次弹出的元素都是堆中最小的元素,堆中剩的是大的;大顶堆中,每次弹出的元素都是堆中最大的元素,堆中剩的是小的。所以我们可以设置一个大小为k的优先队列,遍历Map的过程中去维护这个队列。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。k 的取值范围是 [1, 数组中不相同的元素的个数],队列内部的元素总是有序的,按照元素的权值进行排序。要求频率前k个高的元素的元素,很自然的就是先想到。

qq_65173003的博客 709

LeetCode 力扣 347. 前 K 个高频元素 top k frequent elements hashmap 优先队列 priorityqueue

大家觉得写还可以,可以点赞、收藏、关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录347. 前 K 个高频元素题目描述示例 1:示例 2:提示:分析代码提交结果 347. 前 K 个高频元素 题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出:

motongxue的博客 187
上一篇: 【LeetCode459】重复的子字符串
下一篇: 【LeetCode226】翻转二叉树
Pyroyster
博客等级 码龄7年 206粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值