当前位置: 首页 > news >正文

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
  • 最多调用 insertremove 和 getRandom 函数 2 * 105 次
  • 在调用 getRandom 方法时,数据结构中 至少存在一个 元素。

步骤1:问题定义及输入输出条件

问题性质:
该题目要求实现一个数据结构RandomizedSet,可以高效地执行以下操作:

  1. 插入:如果元素不存在,将其插入集合。
  2. 删除:如果元素存在,将其从集合中删除。
  3. 随机获取元素:随机返回集合中的一个元素,且每个元素有相同的概率被返回。

输入输出条件:

  • insert(int val):如果val不存在于集合中,则插入该元素并返回true;如果存在,则返回false
  • remove(int val):如果val存在于集合中,删除该元素并返回true;如果不存在,返回false
  • getRandom():随机返回集合中的一个元素,要求每个元素的返回概率相同。

限制与边界条件:

  • 数据范围:val 取值范围为 [-2^31, 2^31-1],函数调用次数最多为 2*10^5
  • 调用 getRandom() 时,保证集合中至少存在一个元素。

边界条件:

  1. 空集合remove时如果元素不在集合中,或者对空集合调用getRandom可能会产生边界错误。
  2. 频繁操作:高频调用insertremovegetRandom,每次操作的平均时间复杂度需为O(1)

步骤2:解题思路与算法设计

目标:

  • 插入、删除和获取随机元素的平均时间复杂度为O(1)

算法设计:

  1. 数据结构选择:

    • 哈希表 (unordered_map) + 动态数组 (vector)
      • 使用一个哈希表 map<int, int> 来存储元素到其在数组中的位置的映射。
      • 使用一个动态数组 vector<int> 存储元素值。
      • 这样在插入和删除时,都可以保持O(1)的复杂度,并且可以利用数组支持O(1)时间复杂度的随机访问。
  2. 操作细节:

    • insert(val)
      • 检查val是否存在于哈希表中。如果不存在,插入到数组末尾,并更新哈希表,时间复杂度为O(1)
    • remove(val)
      • 通过哈希表定位val在数组中的位置。为了保持删除操作的O(1),我们将待删除的元素与数组末尾元素交换,然后删除末尾元素,并更新哈希表。
    • getRandom()
      • 直接从数组中随机获取一个元素,时间复杂度为O(1)

时间复杂度分析:

  • insert: 哈希表插入是O(1),动态数组末尾插入是O(1)
  • remove: 哈希表删除是O(1),动态数组末尾删除是O(1)
  • getRandom: 直接从数组中随机访问,时间复杂度为O(1)

步骤3:代码实现

代码注释:

  1. insert(int val):当val不在哈希表中时,将其加入到数组的末尾,并记录其在哈希表中的索引。
  2. remove(int val):先从哈希表中获取待删除元素的位置,将其与数组的最后一个元素交换,再删除最后一个元素,确保删除操作的时间复杂度为O(1)
  3. getRandom():利用数组的随机访问特性,直接生成一个随机索引返回对应的元素。

步骤4:算法优化和启发

通过该问题,我们可以看到如何将多种数据结构结合起来以提升算法效率。哈希表可以实现快速查找,动态数组可以实现高效的随机访问和插入。通过交换和删除末尾元素,可以确保删除操作的O(1)复杂度。

优化启发:

  • 空间效率:虽然结合哈希表和数组可以实现高效的时间复杂度,但需要占用较多的空间。如果数据量非常大,需要权衡时间和空间的平衡。
  • 算法设计思路:此问题展示了如何使用简单的数据结构组合来解决复杂问题,在实际应用中,通过合理的数据结构选择可以极大地提升效率。

步骤5:实际应用场景

该算法可以用于许多需要高效集合操作的场景,比如:

  • 在线游戏服务器:当需要随机选择在线玩家进行匹配时,可以使用该结构存储在线玩家列表并随机选择。
  • 负载均衡:在负载均衡系统中,随机选择服务器进行请求分发,可以通过类似的数据结构实现高效选择和删除。
实际应用示例:负载均衡中的随机服务器选择

在大规模服务器集群中,通常需要从可用的服务器列表中随机选择一台服务器进行任务分发。如果某些服务器挂掉,还需要将其从列表中移除。使用类似RandomizedSet的结构可以高效地管理服务器列表,并快速随机选取可用服务器进行负载均衡。

通过哈希表来快速定位服务器,结合数组来实现随机选择,使得服务器的添加、移除和随机选择都能够在常数时间内完成,提升系统的响应速度和稳定性。

相关文章:

leetcode:380. O(1) 时间插入、删除和获取随机元素

实现RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#xff0c;返回 false 。bool remove(int val) 当元素 val 存在时&#xff0…...

Linux集群部署RabbitMQ

目录 一、准备三台虚拟机&#xff0c;配置相同 1、所有主机都需要hosts文件解析 2、所有主机安装erLang和rabbitmq 3、修改配置文件 4、导入rabbitmq 的管理界面 5、查看节点状态 6、设置erlang运行节点 7、rabitmq2和rabbitmq3重启服务 8、查看各个节点状态 二、添加…...

01DSP学习-了解DSP外设-以逆变器控制为例

(由于是回忆自己简单的DSP学习过程&#xff0c;所以博客看起来有些没有章法&#xff0c;请见谅~) 上一篇博客介绍了学习DSP需要的软件和硬件准备&#xff0c;以及一个DSP的工程包含了哪些东西。我的学习方法是目的导向&#xff0c;即我需要用什么我就学什么&#xff0c;并没有…...

【ArcGIS Pro实操第三期】多模式道路网构建(Multi-model road network construction)原理及实操案例

ArcGIS Pro实操第三期&#xff1a;多模式道路网构建原理及实操案例 1 概述1.1 原理 2 GIS实操2.1 新建文件并导入数据2.2 创建网络数据集2.3 设置连接策略&#xff08;Setting up connectivity policies&#xff09;2.4 添加成本&#xff08;Adding cost attributes&#xff09…...

深度学习基础及技巧

机器学习中的监督学习 监督学习是通过对数据进行分析&#xff0c;找到数据的表达模型&#xff0c;对新输入的数据套用该模型做决策 主要分为训练和预测两个阶段 训练阶段&#xff1a;根据原始数据进行特征提取&#xff0c;然后使用决策树、随机森林等模型算法分析数据之间的特…...

Unity 外描边简单实现(Shader Graph)

1&#xff1a;原理 将物体的模型空间的位置&#xff08;也就是顶点数据&#xff09;放大&#xff0c;作为一个单独的渲染通道单独渲染&#xff0c;这时候模型是已经发大过的&#xff0c;要想看到外描边的效果&#xff0c;需要将正面显示的东西给去掉&#xff0c;显示背面渲染的…...

text2sql方法:NatSQL和DIN-SQL

NatSQL NatSQL出自2021年9月的论文《Natural SQL: Making SQL Easier to Infer from Natural Language Specifications》(github)&#xff0c;它是一种SQL 中间表征(SQL intermediate representation(IR))方法。 NatSQL作者认为Text2SQL的关键挑战是自然语言描述和其对应的SQ…...

【新闻转载】Storm-0501:勒索软件攻击扩展到混合云环境

icrosoft发出警告&#xff0c;勒索软件团伙Storm-0501近期调整了攻击策略&#xff0c;目前正将目标瞄准混合云环境&#xff0c;旨在全面破坏受害者的资产。 该威胁行为者自2021年首次露面&#xff0c;起初作为Sabbath勒索软件行动的分支。随后&#xff0c;他们开始分发来自Hive…...

RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察

RabbitMQ 是一个功能强大且广泛使用的消息代理&#xff0c;它通过处理消息的传输、存储和交付来促进分布式应用程序之间的通信。作为消息代理&#xff0c;RabbitMQ 充当生产者&#xff08;发送消息的应用程序&#xff09;和使用者&#xff08;接收消息的应用程序&#xff09;之…...

Spring Boot 集成 MySQL 的详细指南

在现代软件开发中&#xff0c;Spring Boot 因其简单易用而成为构建 Java 应用程序的热门选择。结合 MySQL这一常用关系型数据库&#xff0c;开发者可以快速构建出功能完善的后端服务。本文将详细介绍如何将 Spring Boot 与 MySQL 集成&#xff0c;提供从环境搭建到代码实现的全…...

python格式化输入输出

以下是使用 format()、f-string 和百分号 % 运算符进行 Python 数据格式化输入输出的示例代码。 1. 使用 format() 方法进行格式化 # 使用 format() 方法格式化数据并输出到文件 name "Alice" age 25 score 92.5# 格式化字符串 formatted_string "Name: {…...

音视频入门基础:FLV专题(10)——Script Tag实例分析

一、引言 在《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中对FLV文件的Script Tag进行了简介。下面用一个具体的例子来对Script Tag进行分析。 二、Script Tag的Tag header实例分析 用notepad打开《音视频入门基础&#xff1a;FLV专题…...

国外问卷调查匠哥已经不带人了,但是还可以交流

国外问卷调查匠哥已经不带人了&#xff0c;但是还可以来和匠哥交流&#xff0c; 为啥不带人了呢&#xff1f; 从今年年初开始&#xff0c;匠哥在带学员的过程中发现&#xff1a; 跟往年同样的收费&#xff0c;同样的教学&#xff0c;甚至我付出的时间精力比以前还多&#xff…...

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 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f525; 所属专栏&#xff1a;C深入学习笔记 &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 参考博客&#xff1a;【C】透过STL源…...

ubuntu 开启root

sudo passwd root#输入以下命令来给root账户设置密码 sudo passwd -u root#启用root账户 su - root#要登录root账户 root 开启远程访问&#xff1a; 小心不要改到这里了&#xff1a;sudo nano /etc/ssh/ssh_config 而是&#xff1a;/etc/ssh/sshd_config sudo nano /etc/ssh…...

使用 Llama 3.1 和 Qdrant 构建多语言医疗保健聊天机器人的步骤

长话短说&#xff1a; 准备好深入研究&#xff1a; 矢量存储的复杂性以及如何利用 Qdrant 进行高效数据摄取。掌握 Qdrant 中的集合管理以获得最佳性能。释放上下文感知响应的相似性搜索的潜力。精心设计复杂的 LangChain 工作流程以增强聊天机器人的功能。将革命性的 Llama …...

【Linux-基础IO】如何理解Linux下一切皆文件磁盘的介绍

目录 如何理解Linux系统上一切皆文件 1.物理角度认识磁盘 2.对磁盘的存储进行逻辑抽象 磁盘寻址 3.磁盘中的寄存器 如何理解Linux系统上一切皆文件 计算机中包含大量外设&#xff0c;操作系统想要管理好这些外设&#xff0c;就必须对这些外设进行先描述再组织&#xff0c…...

Golang | Leetcode Golang题解之第436题寻找右区间

题目&#xff1a; 题解&#xff1a; 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、修改本地项目…...

计算机毕业设计springboot基于java技术的计算机实训室管理系统的设计与实现 基于SpringBoot框架的高校实训室资源预约与信息化管理平台的设计与实现 实验室智能调度与实训过程管理系统

计算机毕业设计springboot基于java技术的计算机实训室管理系统的设计与实现k8svdqb1 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着高校信息化建设的深入推进&#xff0c;传…...

重庆灌浆料销售厂家怎么联系

在重庆的建筑工程领域&#xff0c;灌浆料的应用十分广泛。然而&#xff0c;众多重庆灌浆料厂家的市场状况究竟如何&#xff1f;又存在哪些痛点呢&#xff1f;市场现状&#xff1a;鱼龙混杂目前&#xff0c;重庆灌浆料市场厂家众多&#xff0c;但质量参差不齐。行业权威报告显示…...

别再混淆了!FFmpeg提取AAC/H264流时常见的3个容器格式误区

别再混淆了&#xff01;FFmpeg提取AAC/H264流时常见的3个容器格式误区 第一次用FFmpeg提取音频时&#xff0c;我把.m4a文件直接重命名为.aac&#xff0c;结果播放器报错——这个看似简单的操作背后&#xff0c;隐藏着容器格式与编码格式的深层差异。本文将用真实踩坑案例&#…...

新能源企业数字化转型:从“卖设备“到“卖服务“的服务管理实践

在"双碳"目标驱动下&#xff0c;新能源产业正经历从"投建"到"运营服务"的战略转型。光伏、风电、储能等设备遍布全国各地&#xff0c;售后服务与运维效率直接关系到发电收益与品牌口碑。 然而&#xff0c;很多新能源企业面临一个共同的困境&…...

ROS2数据录制实战:手把手教你用ros2 bag记录Duckiebot图像数据(附常见错误排查)

ROS2数据录制实战&#xff1a;从Duckiebot仿真到真实场景的全流程指南 在机器人开发过程中&#xff0c;数据记录与分析是算法验证和系统调试的关键环节。ROS2提供的ros2 bag工具链为开发者提供了强大的数据采集能力&#xff0c;但实际应用中往往会遇到各种意料之外的问题。本文…...

基于Arduino与Mixly的心知天气实时监测系统开发指南

1. 项目概述与准备 最近在工作室捣鼓了一个特别实用的小项目——用Arduino和Mixly搭建的天气监测系统。这个系统能实时获取温度、湿度、空气质量等数据&#xff0c;特别适合放在阳台或者窗台。我最初做这个是因为家里老人总抱怨手机天气App看不懂&#xff0c;现在有了这个实体设…...

利用快马平台快速构建高清乱码生成器:编码错误可视化原型开发指南

最近在调试一个多语言网站时&#xff0c;遇到了各种编码问题导致的乱码现象。为了更直观地理解不同编码错误的表现形式&#xff0c;我尝试用InsCode(快马)平台快速搭建了一个高清乱码生成器&#xff0c;效果出乎意料地好。下面分享下这个项目的实现思路和具体操作&#xff1a; …...

Kali实战:CTF杂项题必备工具全解析

1. Kali Linux与CTF杂项题简介 第一次参加CTF比赛时&#xff0c;面对五花八门的杂项题完全无从下手。直到发现Kali Linux这个"瑞士军刀"&#xff0c;才真正打开了解题新世界。Kali Linux预装了300安全工具&#xff0c;其中约20%专门用于处理隐写术、文件分析等杂项题…...

5个技巧让你彻底掌握caj2pdf:从开源工具到格式转换的精通指南

5个技巧让你彻底掌握caj2pdf&#xff1a;从开源工具到格式转换的精通指南 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换&#xff0c;成功与否&#xff0c;皆是玄学。 项目地址: https://gitcode…...

Python开发环境搭建新选择:Miniconda-Python3.11镜像体验

Python开发环境搭建新选择&#xff1a;Miniconda-Python3.11镜像体验 1. 为什么选择Miniconda-Python3.11镜像 Python作为当今最流行的编程语言之一&#xff0c;其版本管理和环境隔离一直是开发者面临的挑战。传统的Python安装方式往往会导致&#xff1a; 系统Python版本与项…...