leetcode:380. O(1) 时间插入、删除和获取随机元素
实现RandomizedSet
类:
RandomizedSet()
初始化RandomizedSet
对象bool insert(int val)
当元素val
不存在时,向集合中插入该项,并返回true
;否则,返回false
。bool remove(int val)
当元素val
存在时,从集合中移除该项,并返回true
;否则,返回false
。int getRandom()
随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1)
。
示例:
输入 ["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"] [[], [1], [2], [2], [], [1], [2], []] 输出 [null, true, false, true, 2, true, false, 2]解释 RandomizedSet randomizedSet = new RandomizedSet(); randomizedSet.insert(1); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。 randomizedSet.remove(2); // 返回 false ,表示集合中不存在 2 。 randomizedSet.insert(2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。 randomizedSet.getRandom(); // getRandom 应随机返回 1 或 2 。 randomizedSet.remove(1); // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。 randomizedSet.insert(2); // 2 已在集合中,所以返回 false 。 randomizedSet.getRandom(); // 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。
提示:
-231 <= val <= 231 - 1
- 最多调用
insert
、remove
和getRandom
函数2 *
105
次 - 在调用
getRandom
方法时,数据结构中 至少存在一个 元素。
步骤1:问题定义及输入输出条件
问题性质:
该题目要求实现一个数据结构RandomizedSet
,可以高效地执行以下操作:
- 插入:如果元素不存在,将其插入集合。
- 删除:如果元素存在,将其从集合中删除。
- 随机获取元素:随机返回集合中的一个元素,且每个元素有相同的概率被返回。
输入输出条件:
insert(int val)
:如果val
不存在于集合中,则插入该元素并返回true
;如果存在,则返回false
。remove(int val)
:如果val
存在于集合中,删除该元素并返回true
;如果不存在,返回false
。getRandom()
:随机返回集合中的一个元素,要求每个元素的返回概率相同。
限制与边界条件:
- 数据范围:
val
取值范围为[-2^31, 2^31-1]
,函数调用次数最多为2*10^5
。 - 调用
getRandom()
时,保证集合中至少存在一个元素。
边界条件:
- 空集合:
remove
时如果元素不在集合中,或者对空集合调用getRandom
可能会产生边界错误。 - 频繁操作:高频调用
insert
、remove
和getRandom
,每次操作的平均时间复杂度需为O(1)
。
步骤2:解题思路与算法设计
目标:
- 插入、删除和获取随机元素的平均时间复杂度为
O(1)
。
算法设计:
-
数据结构选择:
- 哈希表 (unordered_map) + 动态数组 (vector):
- 使用一个哈希表
map<int, int>
来存储元素到其在数组中的位置的映射。 - 使用一个动态数组
vector<int>
存储元素值。 - 这样在插入和删除时,都可以保持
O(1)
的复杂度,并且可以利用数组支持O(1)
时间复杂度的随机访问。
- 使用一个哈希表
- 哈希表 (unordered_map) + 动态数组 (vector):
-
操作细节:
- insert(val):
- 检查
val
是否存在于哈希表中。如果不存在,插入到数组末尾,并更新哈希表,时间复杂度为O(1)
。
- 检查
- remove(val):
- 通过哈希表定位
val
在数组中的位置。为了保持删除操作的O(1)
,我们将待删除的元素与数组末尾元素交换,然后删除末尾元素,并更新哈希表。
- 通过哈希表定位
- getRandom():
- 直接从数组中随机获取一个元素,时间复杂度为
O(1)
。
- 直接从数组中随机获取一个元素,时间复杂度为
- insert(val):
时间复杂度分析:
- insert: 哈希表插入是
O(1)
,动态数组末尾插入是O(1)
。 - remove: 哈希表删除是
O(1)
,动态数组末尾删除是O(1)
。 - getRandom: 直接从数组中随机访问,时间复杂度为
O(1)
。
步骤3:代码实现
代码注释:
insert(int val)
:当val
不在哈希表中时,将其加入到数组的末尾,并记录其在哈希表中的索引。remove(int val)
:先从哈希表中获取待删除元素的位置,将其与数组的最后一个元素交换,再删除最后一个元素,确保删除操作的时间复杂度为O(1)
。getRandom()
:利用数组的随机访问特性,直接生成一个随机索引返回对应的元素。
步骤4:算法优化和启发
通过该问题,我们可以看到如何将多种数据结构结合起来以提升算法效率。哈希表可以实现快速查找,动态数组可以实现高效的随机访问和插入。通过交换和删除末尾元素,可以确保删除操作的O(1)
复杂度。
优化启发:
- 空间效率:虽然结合哈希表和数组可以实现高效的时间复杂度,但需要占用较多的空间。如果数据量非常大,需要权衡时间和空间的平衡。
- 算法设计思路:此问题展示了如何使用简单的数据结构组合来解决复杂问题,在实际应用中,通过合理的数据结构选择可以极大地提升效率。
步骤5:实际应用场景
该算法可以用于许多需要高效集合操作的场景,比如:
- 在线游戏服务器:当需要随机选择在线玩家进行匹配时,可以使用该结构存储在线玩家列表并随机选择。
- 负载均衡:在负载均衡系统中,随机选择服务器进行请求分发,可以通过类似的数据结构实现高效选择和删除。
实际应用示例:负载均衡中的随机服务器选择
在大规模服务器集群中,通常需要从可用的服务器列表中随机选择一台服务器进行任务分发。如果某些服务器挂掉,还需要将其从列表中移除。使用类似RandomizedSet
的结构可以高效地管理服务器列表,并快速随机选取可用服务器进行负载均衡。
通过哈希表来快速定位服务器,结合数组来实现随机选择,使得服务器的添加、移除和随机选择都能够在常数时间内完成,提升系统的响应速度和稳定性。
相关文章:
leetcode:380. O(1) 时间插入、删除和获取随机元素
实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。bool remove(int val) 当元素 val 存在时࿰…...
Linux集群部署RabbitMQ
目录 一、准备三台虚拟机,配置相同 1、所有主机都需要hosts文件解析 2、所有主机安装erLang和rabbitmq 3、修改配置文件 4、导入rabbitmq 的管理界面 5、查看节点状态 6、设置erlang运行节点 7、rabitmq2和rabbitmq3重启服务 8、查看各个节点状态 二、添加…...
01DSP学习-了解DSP外设-以逆变器控制为例
(由于是回忆自己简单的DSP学习过程,所以博客看起来有些没有章法,请见谅~) 上一篇博客介绍了学习DSP需要的软件和硬件准备,以及一个DSP的工程包含了哪些东西。我的学习方法是目的导向,即我需要用什么我就学什么,并没有…...
【ArcGIS Pro实操第三期】多模式道路网构建(Multi-model road network construction)原理及实操案例
ArcGIS Pro实操第三期:多模式道路网构建原理及实操案例 1 概述1.1 原理 2 GIS实操2.1 新建文件并导入数据2.2 创建网络数据集2.3 设置连接策略(Setting up connectivity policies)2.4 添加成本(Adding cost attributes)…...
深度学习基础及技巧
机器学习中的监督学习 监督学习是通过对数据进行分析,找到数据的表达模型,对新输入的数据套用该模型做决策 主要分为训练和预测两个阶段 训练阶段:根据原始数据进行特征提取,然后使用决策树、随机森林等模型算法分析数据之间的特…...
Unity 外描边简单实现(Shader Graph)
1:原理 将物体的模型空间的位置(也就是顶点数据)放大,作为一个单独的渲染通道单独渲染,这时候模型是已经发大过的,要想看到外描边的效果,需要将正面显示的东西给去掉,显示背面渲染的…...
text2sql方法:NatSQL和DIN-SQL
NatSQL NatSQL出自2021年9月的论文《Natural SQL: Making SQL Easier to Infer from Natural Language Specifications》(github),它是一种SQL 中间表征(SQL intermediate representation(IR))方法。 NatSQL作者认为Text2SQL的关键挑战是自然语言描述和其对应的SQ…...
【新闻转载】Storm-0501:勒索软件攻击扩展到混合云环境
icrosoft发出警告,勒索软件团伙Storm-0501近期调整了攻击策略,目前正将目标瞄准混合云环境,旨在全面破坏受害者的资产。 该威胁行为者自2021年首次露面,起初作为Sabbath勒索软件行动的分支。随后,他们开始分发来自Hive…...
RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察
RabbitMQ 是一个功能强大且广泛使用的消息代理,它通过处理消息的传输、存储和交付来促进分布式应用程序之间的通信。作为消息代理,RabbitMQ 充当生产者(发送消息的应用程序)和使用者(接收消息的应用程序)之…...
Spring Boot 集成 MySQL 的详细指南
在现代软件开发中,Spring Boot 因其简单易用而成为构建 Java 应用程序的热门选择。结合 MySQL这一常用关系型数据库,开发者可以快速构建出功能完善的后端服务。本文将详细介绍如何将 Spring Boot 与 MySQL 集成,提供从环境搭建到代码实现的全…...
python格式化输入输出
以下是使用 format()、f-string 和百分号 % 运算符进行 Python 数据格式化输入输出的示例代码。 1. 使用 format() 方法进行格式化 # 使用 format() 方法格式化数据并输出到文件 name "Alice" age 25 score 92.5# 格式化字符串 formatted_string "Name: {…...
音视频入门基础:FLV专题(10)——Script Tag实例分析
一、引言 在《音视频入门基础:FLV专题(9)——Script Tag简介》中对FLV文件的Script Tag进行了简介。下面用一个具体的例子来对Script Tag进行分析。 二、Script Tag的Tag header实例分析 用notepad打开《音视频入门基础:FLV专题…...
国外问卷调查匠哥已经不带人了,但是还可以交流
国外问卷调查匠哥已经不带人了,但是还可以来和匠哥交流, 为啥不带人了呢? 从今年年初开始,匠哥在带学员的过程中发现: 跟往年同样的收费,同样的教学,甚至我付出的时间精力比以前还多ÿ…...
Linux 进程的基本概念及描述
目录 0.前言 1. 什么是进程 1.1 进程的定义与特性 1.2 进程与线程的区别 2.描述进程 2.1 PCB (进程控制块) 2.2 task_struct 3.查看进程 3.1 查看进程信息 3.1.1 /proc 文件系统 3.1.2 ps 命令 3.1.2 top 和 htop 命令 3.2 获取进程标识符 3.2.1使用命令获取PID 3.2.2 使用C语言…...
【C++】透过STL源代码深度剖析vector的底层
✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 🔥 所属专栏:C深入学习笔记 💫 欢迎来到我的学习笔记! 参考博客:【C】透过STL源…...
ubuntu 开启root
sudo passwd root#输入以下命令来给root账户设置密码 sudo passwd -u root#启用root账户 su - root#要登录root账户 root 开启远程访问: 小心不要改到这里了:sudo nano /etc/ssh/ssh_config 而是:/etc/ssh/sshd_config sudo nano /etc/ssh…...
使用 Llama 3.1 和 Qdrant 构建多语言医疗保健聊天机器人的步骤
长话短说: 准备好深入研究: 矢量存储的复杂性以及如何利用 Qdrant 进行高效数据摄取。掌握 Qdrant 中的集合管理以获得最佳性能。释放上下文感知响应的相似性搜索的潜力。精心设计复杂的 LangChain 工作流程以增强聊天机器人的功能。将革命性的 Llama …...
【Linux-基础IO】如何理解Linux下一切皆文件磁盘的介绍
目录 如何理解Linux系统上一切皆文件 1.物理角度认识磁盘 2.对磁盘的存储进行逻辑抽象 磁盘寻址 3.磁盘中的寄存器 如何理解Linux系统上一切皆文件 计算机中包含大量外设,操作系统想要管理好这些外设,就必须对这些外设进行先描述再组织,…...
Golang | Leetcode Golang题解之第436题寻找右区间
题目: 题解: func findRightInterval(intervals [][]int) []int {n : len(intervals)type pair struct{ x, i int }starts : make([]pair, n)ends : make([]pair, n)for i, p : range intervals {starts[i] pair{p[0], i}ends[i] pair{p[1], i}}sort.…...
微服务SpringSession解析部署使用全流程
目录 1、SpringSession简介 2、实现session共享的三种方式 1、修改Tomcat配置文件 2、Nginx负载均衡策略 3、redis统一存储 0、准备工作 1、本地服务添加依赖 2、修改本地服务配置文件 3、添加application.properties文件 4、添加nacos - redis配置 5、修改本地项目…...
自动驾驶 3DGS 学习笔记
目录 street_gaussians gsplat依赖项 运行报错: python>3.9 SGD: Street View Synthesis with Gaussian Splatting and Diffusion Prior 差分高斯光栅化 diff-gaussian-rasterization street_gaussians https://github.com/zju3dv/street_gaussians gsp…...
【C++笔试强训】如何成为算法糕手Day5
学习编程就得循环渐进,扎实基础,勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题:游游的you 思路: 第二题:腐烂的苹果 思路: 第三题:孩子们的游戏 思路&…...
【Qt】无IDE的Gui程序快速开始
Qt安装 在 Windows 上安装 Qt 的步骤如下: 下载 Qt 安装程序 访问 Qt 的官方网站:Qt Downloads。点击“Download”按钮,下载 Qt Online Installer(在线安装程序)。 运行安装程序 双击下载的 QtInstaller.exe 文件…...
Python编码系列—Python备忘录模式:掌握对象状态保存与恢复技术
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...
linux常用命令汇编(持续更新)
一、用户提示符 # root账号提示符 $ 普通用户提示符 二、关闭计算机 shutdown(安全有序地关闭计算机) 语法:shutdown [options] [time] [message] shutdown -h now #立即关机(--halt/终止) shutdown -r now #重…...
AI面试指南:AI工具总结评测,助力求职季
AI面试指南:AI工具总结评测,助力求职季 摘要: 在竞争激烈的AI领域秋招季,准备充分并借助高效工具是提升面试通过率的关键。本文主要介绍一些针对秋招的AI面试工具和学习资源,分为简历优化、面试助手、手撕代码练习三个…...
大二考核题解
大二考核题解 题号题目考察知识点A有意思的监考二分答案B海绵宝宝的数独DFSC走楼梯递推D碱基配对kmpE好简单的题啊,写它!最短路 写在前面: 整体难度不大,代码能力需要一些,正常来说至少要会3题以上 A 有意思的监考 …...
深入解析:Kubernetes 如何使用 etcd 作为配置中心和注册中心
在 Kubernetes 中,etcd 是核心的分布式存储组件,负责存储和管理集群的所有配置信息、状态数据以及服务注册信息。etcd 的高可用性和强一致性使得它成为 Kubernetes 的 “source of truth”,确保集群能够动态、高效地管理资源,并保…...
MQ高级:RabbitMQ小细节
在之前的学习中,我们只介绍了消息的发送,但是没有考虑到异常的情况,今天我们就介绍一些异常情况,和细节的部分。 目录 生产者可靠性 生产者重连 生产者确认 MQ可靠性 持久化 Lazy Queue 消费者可靠性 消费者确认机制 失…...
期权卖方怎么选择权利金高的品种,期货VIX高低对行情有什么影响
VIX指数——全称为芝加哥期权交易所市场波动率指数,俗称恐慌指数。 是衡量波动性的重要指标。VIX指数上升,预期未来市场波动性会增加。VIX指数下降,预期未来市场波动性会降低。 期货VIX指数最新价格排序 期权卖方尽量选择期货VIX指数在25以…...
wordpress集成到app/seo网站优化排名
基本概念首先简单介绍一下地理坐标系、大地坐标系以及地图投影的概念:● 地理坐标系:为球面坐标。参考平面地是椭球面,坐标单位:经纬度;● 投影坐标系:为平面坐标。参考平面地是水平面,坐标单位&#x…...
中国旅游电子商务网站建设情况/seo少女
攻防世界 WEB 新手练习区 题目解答 浏览器:Firefox(火狐浏览器) 文章目录001 view source002 robots003 backup004 cookie005 disabled_button006 weak_auth001 view source 难度系数: 1.0 题目来源: Cyberpeace-n3k0 题目描述: X…...
宠物网站素材/文案发布平台
提问嘉宾: 盛国军,上海麦考林信息科技有限公司首席架构师。曾历任8848软件架构师、光芒国际磊客中国技术总监。具有10年互联网和电子商务开发经验,5年软件架构师经验,3年两千万美金投资的大型网站技术总监管理经验。 回答嘉宾&…...
怎么做阿里巴巴官网站/免费网站推广网站在线
or在这里是这样理解的,因为在PHP中并不区分数据类型,所以$file既可以是int也可以bool,所以这样的语句不会报错。但其处理过程可能有些朋友不大明白。其实在大多数的语言中, bool orbool这样的语句中,如果前一个值为真后…...
北京网站建设学校/百度关键词推广公司哪家好
结合 category 工作原理分析 OC2.0 中的 runtime 绝大多数 iOS 开发者在学习 runtime 时都阅读过 runtime.h 文件中的这段代码: struct objc_class {Class isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__Class super_class OBJC2_UNAVAILA…...
电子商务网站管理系统完美版/网站外链平台
1、获取体素在全局坐标系下的坐标(x,y,z),根据ICP配准得到的变换矩阵,将体素的坐标从全局坐标系转换到相机坐标系; 2、根据相机的内参矩阵,转换到图像坐标系,得到体素所在的图像坐标(u,v&#x…...