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

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!

在这里插入图片描述

为了实现 RandomizedSet 类,并且保证每个函数的平均时间复杂度为0(1) ,我们可以结合使用数组和哈希表。数组用于存储集合中的元素,哈希表用于记录每个元素在数组中的索引位置。这样在插入、删除和随机获取元素时都能高效地完成操作。
以下是实现代码及详细注释:

class RandomizedSet {constructor() {// 用于存储集合中的元素this.nums = [];// 用于记录每个元素在数组中的索引位置this.valToIndex = new Map();}/*** 向集合中插入元素* @param {number} val - 要插入的元素* @return {boolean} - 如果元素不存在并成功插入返回 true,否则返回 false*/insert(val) {// 检查元素是否已经存在于集合中if (this.valToIndex.has(val)) {return false;}// 将元素添加到数组末尾this.nums.push(val);// 记录元素在数组中的索引this.valToIndex.set(val, this.nums.length - 1);return true;}/*** 从集合中移除元素* @param {number} val - 要移除的元素* @return {boolean} - 如果元素存在并成功移除返回 true,否则返回 false*/remove(val) {// 检查元素是否存在于集合中if (!this.valToIndex.has(val)) {return false;}// 获取要移除元素的索引const index = this.valToIndex.get(val);// 获取数组的最后一个元素const lastVal = this.nums[this.nums.length - 1];// 将最后一个元素移动到要移除元素的位置this.nums[index] = lastVal;// 更新最后一个元素在哈希表中的索引this.valToIndex.set(lastVal, index);// 移除数组的最后一个元素this.nums.pop();// 从哈希表中删除要移除元素的记录this.valToIndex.delete(val);return true;}/*** 随机返回集合中的一个元素* @return {number} - 随机返回的元素*/getRandom() {// 生成一个 0 到数组长度减 1 之间的随机索引const randomIndex = Math.floor(Math.random() * this.nums.length);// 返回该索引对应的元素return this.nums[randomIndex];}
}

代码解释:

构造函数 constructor():
this.nums:一个数组,用于存储集合中的元素。
this.valToIndex:一个 Map 对象,用于记录每个元素在数组中的索引位置,键为元素值,值为该元素在数组中的索引。
插入方法 insert(val):
首先检查 valToIndex 中是否已经存在该元素,如果存在则返回 false。
若不存在,将元素添加到 nums 数组的末尾,并将该元素及其在数组中的索引记录到 valToIndex 中,最后返回 true。
移除方法 remove(val):
先检查 valToIndex 中是否存在该元素,若不存在则返回 false。
若存在,获取该元素在数组中的索引 index,同时获取数组的最后一个元素 lastVal。
将 lastVal 移动到 index 位置,并更新 lastVal 在 valToIndex 中的索引。
移除 nums 数组的最后一个元素,并从 valToIndex 中删除要移除元素的记录,最后返回 true。
随机获取元素方法 getRandom():
使用 Math.random() 生成一个 0 到 1 之间的随机数,乘以数组的长度并向下取整,得到一个随机索引 randomIndex。
返回 nums 数组中 randomIndex 位置的元素。

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

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

相关文章

Nxopen 直齿轮参数化设计

NXUG1953 Visualstudio 2019 参考论文&#xff1a; A Method for Determining the AGMA Tooth Form Factor from Equations for the Generated Tooth Root Fillet //FullGear// Mandatory UF Includes #include <uf.h> #include <uf_object_types.h>// Internal I…

基于vue和elementui的简易课表

本文参考基于vue和elementui的课程表_vue实现类似课程表的周会议列表-CSDN博客&#xff0c;原程序在vue3.5.13版本下不能运行&#xff0c;修改两处&#xff1a; 1&#xff09;slot-cope改为v-slot 2&#xff09;return background-color:rgb(24 144 255 / 80%);color: #fff; …

Unreal Engine 5 C++ Advanced Action RPG 十一章笔记

第十一章 In Game Widgets 本章节就是做UI2-Template Button Widget 这章节创建不同的UI 结束UI胜利UI暂停菜单主菜单加载UI新建一个按钮小组件作为模版 3-Pause Menu Template Button 继续做更多模版UI 4-Lose Screen(游戏失败UI) 做失败的UI 之前按钮模版的调度程序就在这起…

若依基本使用及改造记录

若依框架想必大家都了解得不少&#xff0c;不可否认这是一款及其简便易用的框架。 在某种情况下&#xff08;比如私活&#xff09;使用起来可谓是快得一匹。 在这里小兵结合自身实际使用情况&#xff0c;记录一下我对若依框架的使用和改造情况。 一、源码下载 前往码云进行…

【数据结构】(1)集合类的认识

一、什么是数据结构 1、数据结构的定义 数据结构就是存储、组织数据的方式&#xff0c;即相互之间存在一种或多种关系的数据元素的集合。 2、学习数据结构的目的 在实际开发中&#xff0c;我们需要使用大量的数据。为了高效地管理这些数据&#xff0c;实现增删改查等操作&…

git相关命令

目录 一、创建 二、添加文件和修改提交文件 1、git add 文件名 添加到暂存区 提交多个文件 撤销回工作区 2、git commit -m "注释" 提交文件到主分支 3、修改后添加&#xff0c;提交 三、版本回退 1、查看日志git log 2、版本回退和撤销 2.1…

第4章 神经网络【1】——损失函数

4.1.从数据中学习 实际的神经网络中&#xff0c;参数的数量成千上万&#xff0c;因此&#xff0c;需要由数据自动决定权重参数的值。 4.1.1.数据驱动 数据是机器学习的核心。 我们的目标是要提取出特征量&#xff0c;特征量指的是从输入数据/图像中提取出的本质的数 …

[c语言日寄]assert函数功能详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

Canny 边缘检测

步骤 1.降噪 应用高斯滤波器&#xff0c;以平滑图像&#xff0c;滤除噪声。 边缘检测易受噪声影响&#xff0c;所以使用高斯滤波器平滑图像&#xff0c;降低噪声。 2.梯度 计算图像中每个像素点的梯度大小和方向。 计算大小 Sobel算子是一种常用的边缘检测滤波器&#xff…

【数据结构】_链表经典算法OJ:合并两个有序数组

目录 1. 题目描述及链接 2. 解题思路 3. 程序 3.1 第一版 3.2 第二版 1. 题目描述及链接 题目链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给…

LiteFlow Spring boot使用方式

文章目录 概述LiteFlow框架的优势规则调用逻辑规则组件定义组件内数据获取通过 DefaultContext自定义上下文 通过 组件规则定义数据通过预先传入数据 liteflow 使用 概述 在每个公司的系统中&#xff0c;总有一些拥有复杂业务逻辑的系统&#xff0c;这些系统承载着核心业务逻…

六、深入了解DI

依赖注入是⼀个过程&#xff0c;是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源&#xff0c;⽽资源指的就是对象. 在上⾯程序案例中&#xff0c;我们使⽤了 Autowired 这个注解&#xff0c;完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…

c++贪心

本篇文章&#xff0c;我将同大家一起学习c的贪心&#xff01;&#xff01;&#xff01; 目录 第一题 题目链接 题目解析 代码原理 代码编写 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第四题 题目链接 题目解…

高低频混合组网系统中基于地理位置信息的信道测量算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

【Python实现机器遗忘算法】复现2020年顶会CVPR算法Selective Forgetting

【Python实现机器遗忘算法】复现2020年顶会CVPR算法Selective Forgetting 1 算法原理 Golatkar, A., Achille, A., & Soatto, S. (2020). Eternal sunshine of the spotless net: Selective forgetting in deep networks. In Proceedings of the IEEE/CVF Conference on Co…

Linux(NTP配置)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; NTP环境搭建 服务端客户端192.168.111.10192.168.111.11Linux MySQL5.7 3.10.0-1160.el7.x86_…

神经网络|(四)概率论基础知识-古典概型

【1】引言 前序学习了线性回归的基础知识&#xff0c;了解到最小二乘法可以做线性回归分析&#xff0c;但为何最小二乘法如此准确&#xff0c;这需要从概率论的角度给出依据。 因此从本文起&#xff0c;需要花一段时间来回顾概率论的基础知识。 【2】古典概型 古典概型是我…

21款炫酷烟花合集

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码&#xff1a;Python动漫烟花&#xff08;完整代码&#xff09; ​ Python烟花② 完整…

新项目上传gitlab

Git global setup git config --global user.name “FUFANGYU” git config --global user.email “fyfucnic.cn” Create a new repository git clone gitgit.dev.arp.cn:casDs/sawrd.git cd sawrd touch README.md git add README.md git commit -m “add README” git push…

Brightness Controller-源码记录

Brightness Controller 亮度控制 一、概述二、ddcutil 与 xrandr1. ddcutil2. xrandr 三、部分代码解析1. icons2. ui3. utilinit.py 一、概述 项目&#xff1a;https://github.com/SunStorm2018/Brightness.git 原理&#xff1a;Brightness Controlle 是我在 Ubuntu 发现上调…