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

实现RandomizedSet 类:

  • RandomizedSet() 初始化 RandomizedSet 对象
  • bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
  • bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
  • int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。

你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。

代码实现

class RandomizedSet {// 用于存储元素的数组private nums: number[];// 用于记录元素在数组中索引的哈希表private indexMap: Map<number, number>;constructor() {this.nums = [];this.indexMap = new Map();}insert(val: number): boolean {if (this.indexMap.has(val)) {return false;}// 将元素添加到数组末尾this.nums.push(val);// 记录元素在数组中的索引this.indexMap.set(val, this.nums.length - 1);return true;}remove(val: number): boolean {if (!this.indexMap.has(val)) {return false;}const index = this.indexMap.get(val)!;const lastIndex = this.nums.length - 1;const lastVal = this.nums[lastIndex];// 将数组最后一个元素移动到要删除元素的位置this.nums[index] = lastVal;// 更新最后一个元素在哈希表中的索引this.indexMap.set(lastVal, index);// 删除数组最后一个元素this.nums.pop();// 从哈希表中删除要删除的元素this.indexMap.delete(val);return true;}getRandom(): number {// 随机生成一个 0 到数组长度减 1 之间的索引const randomIndex = Math.floor(Math.random() * this.nums.length);return this.nums[randomIndex];}
}// 示例调用
const randomizedSet = new RandomizedSet();
console.log(randomizedSet.insert(1)); // 返回 true
console.log(randomizedSet.remove(2)); // 返回 false
console.log(randomizedSet.insert(2)); // 返回 true
console.log(randomizedSet.getRandom()); // 随机返回 1 或 2
console.log(randomizedSet.remove(1)); // 返回 true
console.log(randomizedSet.insert(2)); // 返回 false
console.log(randomizedSet.getRandom()); // 返回 2

代码解释

  1. 构造函数 constructor

    • 初始化一个空数组 nums 用于存储元素。
    • 初始化一个空的 Map 对象 indexMap 用于记录每个元素在数组中的索引。
  2. 插入方法 insert

    • 检查 indexMap 中是否已经存在该元素,如果存在则返回 false
    • 若不存在,将元素添加到 nums 数组的末尾,并在 indexMap 中记录该元素的索引,最后返回 true
  3. 删除方法 remove

    • 检查 indexMap 中是否存在该元素,如果不存在则返回 false
    • 若存在,获取该元素在数组中的索引 index 以及数组最后一个元素的索引 lastIndex 和值 lastVal
    • 将数组最后一个元素移动到要删除元素的位置,并更新 indexMap 中最后一个元素的索引。
    • 删除数组最后一个元素,并从 indexMap 中删除要删除的元素,最后返回 true
  4. 随机获取元素方法 getRandom

    • 使用 Math.random() 生成一个 0 到数组长度减 1 之间的随机整数作为索引。
    • 返回该索引对应的数组元素。

复杂度分析

  • 时间复杂度insertremove 和 getRandom 方法的平均时间复杂度均为 O(1)。insert 操作主要是数组的 push 和 Map 的 set 操作;remove 操作虽然涉及数组元素的移动,但只是常数级的操作;getRandom 操作是根据随机索引直接访问数组元素。
  • 空间复杂度:O(n),其中  是集合中元素的数量,主要用于存储数组和哈希表。

 

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

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

相关文章

Python蓝桥杯刷题-小数第n位详解

题目描述 我们知道&#xff0c;整数做除法时&#xff0c;有时得到有限小数&#xff0c;有时得到无限循环小数。 如果我们把有限小数的末尾加上无限多个 0&#xff0c;它们就有了统一的形式。 本题的任务是&#xff1a;在上面的约定下&#xff0c;求整数除法小数点后的第 n 位开…

android,flutter 混合开发,pigeon通信,传参

文章目录 app效果native和flutter通信的基础知识1. 编解码器 一致性和完整性&#xff0c;安全性&#xff0c;性能优化2. android代码3. dart代码 1. 创建flutter_module2.修改 Android 项目的 settings.gradle&#xff0c;添加 Flutter module3. 在 Android app 的 build.gradl…

Redis 客户端C++使用

安装 redis-plus-plus 在C中使用Redis&#xff0c;通常需要借助第三方库来实现与Redis服务器的交互。目前比较流行的库有 redis-plus-plus 和 hiredis。redis-plus-plus 是基于 hiredis 实现的&#xff0c;hiredis 是⼀个 C 语⾔实现的 redis 客⼾端&#xff0c;因此需要先安装…

Python的那些事第二十二篇:基于 Python 的 Django 框架在 Web 开发中的应用研究

基于 Python 的 Django 框架在 Web 开发中的应用研究 摘要 Django 是一个基于 Python 的高级 Web 框架,以其开发效率高、安全性和可扩展性强等特点被广泛应用于现代 Web 开发。本文首先介绍了 Django 的基本架构和核心特性,然后通过一个实际的 Web 开发项目案例,展示了 Dj…

亲测Windows部署Ollama+WebUI可视化

一. Ollama下载 登录Ollama官网(Ollama)点击Download进行下载 如果下载很慢可用以下地址下载&#xff1a; https://github.com/ollama/ollama/releases/download/v0.5.7/OllamaSetup.exe 在DeepSeek官网上&#xff0c;你可以直接点击【model】 到达这个界面之后&#xff0c;…

SpringBoot2.0整合Redis(Lettuce版本)

前言&#xff1a; 目前java操作redis的客户端有jedis跟Lettuce。在springboot1.x系列中&#xff0c;其中使用的是jedis, 但是到了springboot2.x其中使用的是Lettuce。 因为我们的版本是springboot2.x系列&#xff0c;所以今天使用的是Lettuce。关于jedis跟lettuce的区别&#…

自由学习记录(36)

Linux Linux 是一个开源的操作系统&#xff0c;其内核及大部分组件都遵循自由软件许可证&#xff08;如 GPL&#xff09;&#xff0c;允许用户查看、修改和分发代码。这种开放性使得开发者和企业可以根据自己的需求定制系统​。 “Linux”严格来说只是指由Linus Torvalds最初开…

【数据分享】1929-2024年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站…

如何使用Redis实现分布式锁

通常情况下&#xff0c;我们一般会选择基于 Redis 或者 ZooKeeper 实现分布式锁&#xff0c;Redis 用的要更多一点&#xff0c;我这里也先以 Redis 为例介绍分布式锁的实现。 基于 Redis 实现分布式锁 如何基于 Redis 实现一个最简易的分布式锁&#xff1f; 不论是本地锁还是…

【办公类-90-02】】20250215大班周计划四类活动的写法(分散运动、户外游戏、个别化综合)(基础列表采用读取WORD表格单元格数据,非采用切片组合)

背景需求&#xff1a; 做了中班的四类活动安排表&#xff0c;我顺便给大班做一套 【办公类-90-01】】20250213中班周计划四类活动的写法&#xff08;分散运动、户外游戏、个别化&#xff08;美工室图书吧探索室&#xff09;&#xff09;-CSDN博客文章浏览阅读874次&#xff0…

scroll、offset、client三大家族和getBoundingClientRect方法

scroll、offset、client三大家族和getBoundingClientRect方法 1.offset(只能读,不能修改&#xff09;2.client(只能读,不能修改&#xff09;3.scroll滚动家族4.getBoundingClientRect方法 1.offset(只能读,不能修改&#xff09; offsetParent:离当前元素最近的有定位的祖先元素…

【LeetCode】LCR 139. 训练计划 I

题目 教练使用整数数组 actions 记录一系列核心肌群训练项目编号。为增强训练趣味性&#xff0c;需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组 形式返回。 示例 1&#xff1a; 输入&#xff1a;actions [1,2,3,4,5] 输出&#…

Ubuntu 20.04源码安装opencv 4.5.0

安装依赖项 sudo apt install -y g sudo apt install -y cmake sudo apt install -y make sudo apt install -y wget unzip安装opencv依赖库 sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev l…

阿里云上的网站配置HTTPS

1. 获取SSL证书 创建证书 下载证书 下载 上传 .key .pem 文件 到 阿里云服务器 /etc/nginx/ssl nginx.conf 配置 server { listen 443 ssl; server_name yuming; ssl_certificate /etc/nginx/ssl/*.pem; ssl_certificate_key /etc/nginx/ssl/*.key;

jetbrains IDEA集成大语言模型

一、CodeGPT ‌CodeGPT‌是由CSDN打造的一款生成式AI产品&#xff0c;专为开发者量身定制。它能够提供强大的技术支持&#xff0c;帮助开发者在学习新技术或解决实际工作中的各种计算机和开发难题‌1。 idea集成 1.在线安装&#xff1a;直接在线安装 2.离线安装 JetBrains Mar…

记录一次部署PC端网址全过程

当我查看我之前写的文章时、顿时惊奇发出感慨&#xff1a;啥时候写的&#xff1f;是我写的么&#xff1f;疑惑重重… 所以说&#xff0c;好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步&#xff1a;第一步&#xff1a;申请域名并映射到外网IP &#xff0…

鸿蒙5.0实战案例:关于图像撕裂、掉帧等异常现象的原理以及优化方案

往期推文全新看点&#xff08;文中附带全新鸿蒙5.0全栈学习笔录&#xff09; ✏️ 鸿蒙&#xff08;HarmonyOS&#xff09;北向开发知识点记录~ ✏️ 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…

C#项目05-猜数字多线程

本项目利用多线程&#xff0c;通过点击按钮猜数字&#xff0c; 知识点 线程 基本概念 进程:一组资源&#xff0c;构成一个正在运行的程序&#xff0c;这些资源包括地址空间、文件句柄以及程序启动需要的其他东西的载体。 线程:体现一个程序的真实执行情况&#xff0c; 线…

广西壮族自治区园区投促中心党委书记陶德文率团到访深兰科技

2月16日&#xff0c;广西壮族自治区园区投促中心党委书记、主任&#xff0c;自治区园区办党组成员陶德文率团来到深兰科技集团上海总部考察调研&#xff0c;并与深兰科技集团创始人、董事长陈海波等集团管理层座谈交流&#xff0c;双方围绕深兰科技人工智能项目落地广西的相关事…

推荐几款较好的开源成熟框架

一. 若依&#xff1a; 1. 官方网站&#xff1a;https://doc.ruoyi.vip/ruoyi/ 2. 若依SpringBootVueElement 的后台管理系统&#xff1a;https://gitee.com/y_project/RuoYi-Vue 3. 若依SpringBootVueElement 的后台管理系统&#xff1a;https://gitee.com/y_project/RuoYi-Cl…