(数组/字符串) 380. O(1) 时间插入、删除和获取随机元素 ——【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 ) O(1) 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 。

提示

  • − 2 31 < = v a l < = 2 31 − 1 -2^{31} <= val <= 2^{31} - 1 231<=val<=2311
  • 最多调用 insertremovegetRandom 函数 2 ∗ 1 0 5 2 * 10^5 2105
  • 在调用 getRandom 方法时,数据结构中 至少存在一个 元素。

💡思路:哈希表 + 变长数组

哈希表可以在 O ( 1 ) O(1) O(1) 的时间内完成 插入删除 操作,但是由于无法根据下标定位到特定元素,因此不能在 O ( 1 ) O(1) O(1) 的时间内完成 获取随机元素 操作。而数组可以在 O ( 1 ) O(1) O(1) 的时间内完成 获取随机元素 操作。所以使用哈希表加数组:

  • 哈希表记录 加入删除 的数,可以 O ( 1 ) O(1) O(1) 检查是否出现过;
  • 用数组 nums 维护所有数,方便随机取一个数,数组后加入一个数也是 O ( 1 ) O(1) O(1)
  • 哈希表 维护每个数加入时的坐标,以加入的元素 val主键, 以数组 nums 下标为
  • 在要删除的数不是数组最后一个时,与最后一个交换(因为是不在乎顺序的,所以这种交换不影响任何东西),此时要删除的数成为数组最后一个,可以 O ( 1 ) O(1) O(1) 删除。

🍁代码:(C++、Java)

C++

class RandomizedSet {
private:unordered_map<int, int> map; //哈希表储存元素值和对应下标,为了访问时实现O(1)vector<int> nums;public:RandomizedSet() {}bool insert(int val) {if(map.find(val) != map.end()) return false;nums.push_back(val);map[val] = nums.size() - 1;return true;}bool remove(int val) {if(map.find(val) == map.end()) return false;int idx = nums.size() - 1;if(map[val] != idx){nums[map[val]] = nums[idx];map[nums[idx]] = map[val];}nums.pop_back();map.erase(val);return true;}int getRandom() {int size = nums.size();int random = rand() % size;return nums[random];}
};/*** Your RandomizedSet object will be instantiated and called as such:* RandomizedSet* obj = new RandomizedSet();* bool param_1 = obj->insert(val);* bool param_2 = obj->remove(val);* int param_3 = obj->getRandom();*/

Java

class RandomizedSet {static int[] nums = new int[200010];Random random = new Random();Map<Integer, Integer> map = new HashMap<>();int idx = -1;public RandomizedSet() {}public boolean insert(int val) {if(map.containsKey(val)) return false;nums[++idx] = val;map.put(val, idx);return true;}public boolean remove(int val) {if(!map.containsKey(val)) return false;int loc = map.remove(val);if(loc != idx) map.put(nums[idx], loc);nums[loc] = nums[idx--];return true;}public int getRandom() {return nums[random.nextInt(idx + 1)];}
}/*** Your RandomizedSet object will be instantiated and called as such:* RandomizedSet obj = new RandomizedSet();* boolean param_1 = obj.insert(val);* boolean param_2 = obj.remove(val);* int param_3 = obj.getRandom();*/
🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:
  • 时间复杂度 O ( 1 ) O(1) O(1),初始化和各项操作的时间复杂度都是 O ( 1 ) O(1) O(1)
  • 空间复杂度 O ( n ) O(n) O(n),其中 n 是集合中的元素个数。存储元素的数组和哈希表需要 O ( n ) O(n) O(n) 的空间。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

YUM 升级 PHP7

文章目录 YUM 升级 PHP71. 查看当前 PHP 信息2. YUM 安装 PHP73. 查看 PHP 版本4. 启动PHP-FPM YUM 升级 PHP7 参考地址&#xff1a;网站地址 参考地址&#xff1a;网站地址 1. 查看当前 PHP 信息 # 查看 PHP 版本信息 php -v# 查看 yum 源中 PHP 信息 yum list | grep php2. …

Kafka-UI

有多款kafka管理应用&#xff0c;目前选择的是github上star最多的UI for Apache Kafka。 关于 To run UI for Apache Kafka, you can use either a pre-built Docker image or build it (or a jar file) yourself. UI for Apache Kafka is a versatile, fast, and lightweight…

工作中Git管理项目和常见问题处理

工作中Git管理项目和常见问题处理 Git仓库的管理方式为什么会出现无法push到线上处理方法 Git仓库的管理方式 共用统一仓库,不同开发人员使用不同分支 步骤 下载代码 git clone <url>查看分支 git branch创建并切换分支 git checkout -b dev分支名称保持和远程分支一…

8.2 Jmeter if控制器使用

前提&#xff1a;jmeter脚本需要用到if控制器&#xff0c;if判断如果查询不到&#xff0c;则去新增。 1、添加if控制器 线程组-->逻辑控制器-->如果(if)控制器 1&#xff09;、Expression (must evaluate to true or false) &#xff1a;表达式&#xff08;值必须是tru…

程序开发常用在线工具汇总

菜鸟工具# https://c.runoob.com/ 编码# ASCII码# https://www.habaijian.com/ 在线转换# https://www.107000.com/T-Ascii/http://www.ab126.com/goju/1711.html Base64# 在线转换# https://www.qqxiuzi.cn/bianma/base64.htmhttp://www.mxcz.net/tools/Unicode.aspx …

计算机视觉与深度学习-图像分割-视觉识别任务03-实例分割-【北邮鲁鹏】

目录 参考定义Mark R-CNN结构思路Mask R-CNN训练阶段使用的Mask样例Mask R-CNN实例分割结果Mask R-CNN检测姿态 参考 论文题目&#xff1a;Mask R-CNN 论文链接&#xff1a;论文下载 论文代码&#xff1a;Facebook代码链接&#xff1b;Tensorflow版本代码链接&#xff1b; K…

用AI解决量子学问题

3 人工智能用于量子力学 在这一部分中&#xff0c;我们提供了有关如何设计高级深度学习方法以有效学习神经波函数的技术评述。在第3.1节中&#xff0c;我们概述了一般情况下定义和解决量子多体问题的方法。在第3.2节中&#xff0c;我们介绍了学习量子自旋系统基态的方法。在第…

4G工业路由器高效数据传输助力光伏发电站管理

光伏发电站是能源产业中一种利用太阳能技术将光转化为电能的常见设施。随着物联网技术与环保能源的不断进步和应用的普及&#xff0c;光伏发电站的管理也变得更加便捷高效。 光伏发电站结合4G工业路由器实现远程监控管理&#xff0c;并用于采集发电站中的传感器数据和监控信息…

Ubuntu 安装Kafka

在本指南中&#xff0c;我们将逐步演示如何在 Ubuntu 22.04 上安装 Apache Kafka。 在大数据中&#xff0c;数以百万计的数据源生成了大量的数据记录流&#xff0c;这些数据源包括社交媒体平台、企业系统、移动应用程序和物联网设备等。如此庞大的数据带来的主要挑战有两个方面…

BUUCTF:[MRCTF2020]套娃

查看源码发现 PHP非法参数名传参问题&#xff0c;详细请参考我的这篇文章&#xff1a;谈一谈PHP中关于非法参数名传参问题 正则这里绕过使用%0a换行符绕过&#xff0c;payload: /?b.u.p.t23333%0a 得到下一步信息&#xff1a;secrettw.php 注释中的是JsFuck&#xff0c;用这…

如何快速重置模型原点

1、什么是模型原点&#xff1f; 模型原点是三维建模中的概念&#xff0c;它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示&#xff1a; 可以看到模型的原点在模型的几何中心 2、模型原点的作用 知道了什么是模型原点&…

微服务保护

1.初识Sentinel 1.1.雪崩问题及解决方案 1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff0c;因此也会被阻塞…

【C++入门指南】C如何过渡到C++?祖师爷究竟对C++做了什么?

【C入门指南】C如何过渡到C&#xff1f;祖师爷究竟对C做了什么&#xff1f; 前言一、命名空间1.1 命名空间的定义1.2 命名空间使用 二、C输入、输出2.1 std命名空间的使用惯例 三、缺省参数3.1 缺省参数的定义3.2 缺省参数分类 四、函数重载4.1 函数重载概念4.2 C支持函数重载的…

IP行业查询API:为用户分析提供帮助

引言 在数字化时代&#xff0c;IP地址不仅代表着设备在互联网上的位置&#xff0c;还蕴含着丰富的信息。IP地址所属行业查询API应运而生&#xff0c;为用户分析提供了有力支持。本文将探讨这一工具的应用&#xff0c;以及对用户分析的帮助。 IP行业API的应用 1. 目标市场定位…

Gartner公布《2023中国ICT技术成熟度曲线》,得帆信息入选低代码代表厂商

近日&#xff0c;Gartner发布《2023年中国ICT技术成熟度曲线》&#xff08;《Hype Cycle for ICT in China, 2023》&#xff09;&#xff0c;对国内本年度ICT的发展趋势进行分析与总结&#xff0c;得帆信息作为低代码PaaS平台代表供应商&#xff08;LCAP Sample Vendor&#xf…

低代码平台如何助力国内企业数字化转型?

数字化是什么 数字化&#xff08;Digitalization&#xff09;是将许多复杂多变的信息转变为可以度量的数字、数据&#xff0c;再以这些数字、数据建立起适当的数字化模型&#xff0c;把它们转变为一系列二进制代码&#xff0c;引入计算机内部&#xff0c;进行统一处理&#xf…

单元测试spring-boot-starter-test

参考博客&#xff1a; https://www.cnblogs.com/mzc1997/p/14306538.html 配置pom junit-vintage-engine junit4 junit-jupiter-engine junit5 排除junit4使用junit5,两者在切换时要特别注意 <dependency><groupId>org.springframework.boot</groupId><…

【产品运营】如何做好B端产品规划

产品规划是基于当下掌握的多维度信息&#xff0c;为追求特定目的&#xff0c;而制定的产品资源投入计划。 产品规划是基于当下掌握的多维度信息&#xff08;客户需求、市场趋势、竞争对手、竞争策略等&#xff09;&#xff0c;为追求特定目的&#xff08;商业增长、客户满意等&…

数码产品数码配件无线键盘等出口欧盟CE-RED认证测试办理

数码产品数码配件无线键盘CE-RED认证测试办理 无线产品CE-RED认证进入东欧市场规定&#xff1a; 在通信终端设备和无线产品在这些/地区合法销售之前&#xff0c;必须按照 RED 指令进行测试&#xff0c;并且还必须提供 CE 标志。无线远程控制产品必须符合 RED 指令的 REDEU 要…

ruoyi-nbcio增加websocket与测试页面

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 为了后面流程发起等消息推送&#xff0c;所以需要集成websocket。 1、后端增加websoket支持 首先在framework模块里的pom.xml增加websocket <dependency…