每日leetcode--前K个高频元素

news/发布时间2024/5/14 9:38:15

题目

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

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路 

当使用频率最高的元素前k个作为题目的要求时,可以使用哈希表和堆的数据结构来解决。下面是哈希表解决方案。

  • 首先创建一个哈希表val_times,用于存储每个元素出现的次数。然后,遍历给定的列表nums,将每个元素作为键,初始次数为0,存入哈希表中。接着,再次遍历nums,将对应元素在哈希表中的次数加1。
  • 为了找出出现次数最多的前k个元素,我们需要将次数转化为负数,并使用最小堆来维护前k个最大的次数。首先,将哈希表中所有次数取反并存入一个列表times中。然后,使用heapify方法将times转化为最小堆。
  • 接下来,我们创建一个空列表times_list用于存储前k个最大次数(即堆中最小的k个元素)。通过循环k次,每次从堆中弹出一个元素并将其加入times_list中。
  • 最后,我们需要根据最大次数找到对应的元素值。遍历times_list,对于每个次数,再次遍历val_times,找到对应次数的元素值,并将其加入结果列表ret_list中。为了避免重复使用相同的元素,我们将已经使用过的元素在哈希表中标记为'used'。
  • 最终,返回结果列表ret_list即为出现次数最多的前k个元素。

详细解析链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

python代码

class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:val_times = {}#初始化val_timesfor i in nums:val_times[i] = 0for i in nums:val_times[i]+=1#求排在前k名的timestimes = list(val_times.values())for i in range(len(times)):times[i] = -times[i]heapify(times)times_list = []ret_list = []for i in range(k):        times_list.append(-heappop(times))# 找出times对应的valsfor time in times_list:for val,tm in val_times.items():if time == tm and time != 'used':   ret_list.append(val)val_times[val] = 'used'         #标记用过的vals,防止重复breakreturn ret_list

性能分析

  • 时间复杂度:建立哈希表的时间复杂度为O(n),堆的构建时间复杂度为O(klogk),遍历哈希表的时间复杂度为O(n+k),因此总体时间复杂度为O(n+klogk)。
  • 空间复杂度:哈希表和堆分别需要O(n)和O(k)的空间,因此总体空间复杂度为O(n+k)。

示例和测试: 假设输入数组为[1, 1, 1, 2, 2, 3],k为2,则输出结果应为[1, 2]。

总结

总结: 本文介绍了一种使用哈希表和堆来找出出现频率最高的前k个元素的解决方案。该方案在时间和空间复杂度上都具有较好的表现,适用于需要高效解决类似问题的场景。同时,在实际应用中,可以根据具体需求对算法进行相应的优化和拓展。

希望本文能够帮助你更好地理解并应用哈希表和堆这两种数据结构,并提高解决类似问题的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/Dgue/3480.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

力扣226 翻转二叉树 Java版本

文章目录 题目描述解题思路代码 题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 2: 输入:root…

笔记-电感充放电过程状态记录

描述:电感充放电过程状态记录 为加深对电感充放电的理解,特做一次记录。 目录 一、准备工作二、电感状态记录1、电感刚开始充电瞬间2、电感充电期间3、电感充电完毕4、电感开始放电瞬间5、电感放电完毕6、电感充放电完整记录 一、准备工作 1、在线平台…

vue2+element医院安全(不良)事件报告管理系统源代码

目录 安全不良事件类型 源码技术栈 医院安全(不良)事件报告管理系统采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,实现以事件为主要对象,可以自动、及时、实际地反应医院的安全、不良、近失事件…

第十一天-Excel的操作

目录 1.xlrd-Excel的读模块 安装 使用 获取工作簿 读取工作簿的内容 xlsxwriter-Excel的写模块 安装 使用 生成图表 add_series参数 图表的样式 demo:生成图表 Excel的操作在python中有多个模块,为了能够快速使用,选择了相对简单…

Sora领航AIGC时代:深度解读行业变革与AI工具全景图

随着人工智能技术的飞速发展,越来越多的企业和行业开始将AI融入其核心业务流程中。在这个背景下,Sora以其独特的视角和全面的解决方案,正引领着AIGC(人工智能生成内容)的趋势变革。 本文将对Sora进行深度解读&#xf…

vue3在router跳转路由时,params失效问题

vue-router重要提示。 解决方案: 1. 使用query传参 但是变量会直接暴露在url中 2.用store或localStorage这种办法暂存一下。

使用腾讯云COS提示CORS策略阻止的解决方案

报错 看到了跨域报错,进行腾讯云配置 1、找到自己的存储桶 2、点击跨域的CORS设置 3、进行规则添加

人工智能_CPU微调ChatGLM大模型_使用P-Tuning v2进行大模型微调_007_微调_002---人工智能工作笔记0102

这里我们先试着训练一下,我们用官方提供的训练数据进行训练. 也没有说使用CPU可以进行微调,但是我们先执行一下试试: https://www.heywhale.com/mw/project/6436d82948f7da1fee2be59e 可以看到说INT4量化级别最低需要7GB显存可以启动微调,但是 并没有说CPU可以进行微调.我们…

SpringBoot实现缓存预热的几种常用方案

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

spring boot3登录开发-3(账密登录逻辑实现)

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 前置条件 内容简介 用户登录逻辑实现 创建交互对象 1.创建用户登录DTO 2.创建用户登录VO 创建自定义登录业务异…

Selenium IDE插件录制网页,解放双手

1、 国内下载地址 https://www.crx4chrome.com/crx/77585/ ,这个网络正常基本可以下载,目前最新版本是3.17.2。 点击Crx4Chrome下载。下载后的文件名称是:mooikfkahbdckldjjndioackbalphokd-3.17.2-Crx4Chrome.com.crx。 2、 安装 直接打开…

easyui 手风琴Accordion 面板的高度设置

今天接到一个新的小需求,如下图,当预算表单只有一个时,要求不显示预算表单这块的内容。 考虑到页面创建时用到了表单的回调和点击方法,所以不能单纯的移除,移除右侧表格的创建会报错,所以只能隐藏。 隐藏…

postgresql矢量切片坐标转换的ST_AsMVTGeom函数使用

一、函数签名 geometry ST_AsMVTGeom(geometry geom, box2d bounds, integer extent4096, integer buffer256, boolean clip_geomtrue); 二、描述 将一个图层中位于参数box2d范围内的一个几何图形的所有坐标转换为MapBox VectorTile坐标空间里的坐标。 该函数会尽量保持、甚至纠…

《VitePress 简易速速上手小册》第5章:社交媒体和网络互动(2024 最新版)

文章目录 5.1 社交媒体策略5.1.1 基础知识点解析5.1.2 重点案例:生活方式博客5.1.3 拓展案例 1:科技新闻网站5.1.4 拓展案例 2:手工艺品电商平台5.2 互动和参与5.2.1 基础知识点解析5.2.2 重点案例:健身教练的社交媒体5.2.3 拓展案例 1:餐饮业者5.2.4 拓展案例 2:旅游博客…

五、使用脚手架

五、使用脚手架 5.1 简单的实现 创建一个 School 组件 <template> <div><h2>学校名称&#xff1a;{{name}}</h2><h2>学校地址&#xff1a;{{address}}</h2> </div> </template><script> export default {name: "S…

Spring篇----第二篇

系列文章目录 文章目录 系列文章目录前言一、Spring Framework 中有多少个模块,它们分别是什么?二、什么是 Spring 配置文件?三、Spring 应用程序有哪些不同组件?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站…

【Linux进阶之路】Socket —— “UDP“ “TCP“

文章目录 一、再识网络1. 端口号2. 网络字节序列3.TCP 与 UDP 二、套接字1.sockaddr结构2.UDP1.server端1.1 构造函数1.2 Init1.3 Run 2.客户端1.Linux2.Windows 3.TCP1. 基本接口2. 客户端3. 服务端1.版本12.版本23.版本34.版本4 三、守护进程尾序 温馨提示&#xff1a;文章较…

数据同步MySQL -> Elasticsearch

大家好我是苏麟,今天聊聊数据同步 . 数据同步 一般情况下&#xff0c;如果做查询搜索功能&#xff0c;使用 ES 来模糊搜索&#xff0c;但是数据是存放在数据库 MySQL 里的&#xff0c;所以说我们需要把 MySQL 中的数据和 ES 进行同步&#xff0c;保证数据一致(以 MySQL 为主)…

CentOS7 安装SSH

说实话&#xff0c;感觉CentOS有点难用。初始配置不是很友好&#xff0c;连自动获取IP地址都是关着的。当然&#xff0c;我这里本地用的是虚拟机。 开启获取IP 首先是获取IP地址&#xff0c;这是一些的起点。 首先使用ip addr 看看网卡地址和名称。我这边是ens33。然后打开自…

C++的vector容器->基本概念、构造函数、赋值操作、容量和大小、插入和删除、数据存取、互换容器、预留空间

#include<iostream> using namespace std; #include <vector> //vector容器构造 void printVector(vector<int>& v) { for (vector<int>::iterator it v.begin(); it ! v.end(); it) { cout << *it << " "…
推荐文章