[LeetCode] 380. O(1) 时间插入、删除、获取随机元素

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

labuladong 题解

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

题解

要实现一个 RandomizedSet 类,满足 insert, removegetRandom 方法的平均时间复杂度为 O(1),可以采用哈希表结合动态数组的方式。这种方法能够在常数时间内实现插入、删除和获取随机元素的操作。

下面是实现这个类的思路和步骤:

  1. 数据结构:

    • 使用一个动态数组 vector 存储元素,以支持 O(1) 时间复杂度的 getRandom 操作。
    • 使用一个哈希表 unordered_map 存储元素值与其在数组中的索引,以支持 O(1) 时间复杂度的 insertremove 操作。
  2. 插入操作 (insert):

    • 检查哈希表中是否已存在该元素,如果存在,返回 false
    • 将元素添加到数组末尾,并在哈希表中记录元素的值和索引。
    • 返回 true
  3. 删除操作 (remove):

    • 检查哈希表中是否存在该元素,如果不存在,返回 false
    • 从哈希表获取元素在数组中的索引。
    • 将数组最后一个元素移动到要删除元素的位置(这一步是为了保持数组的连续性,同时不破坏 O(1) 的时间复杂度)。
    • 更新哈希表中的索引信息。
    • 从数组和哈希表中删除元素。
    • 返回 true
  4. 获取随机元素 (getRandom):

    • 从数组中随机选择一个元素并返回。

为了实现 RandomizedSet 类并确保每个方法的时间复杂度为 O(1),我们可以按照之前讨论的策略使用 C++ 来实现。下面是具体的实现代码:

#include <vector>
#include <unordered_map>
#include <cstdlib>class RandomizedSet {
private:std::vector<int> nums;std::unordered_map<int, int> valToIndex;public:RandomizedSet() {}bool insert(int val) {if (valToIndex.find(val) != valToIndex.end()) {return false;}nums.push_back(val);valToIndex[val] = nums.size() - 1;return true;}bool remove(int val) {if (valToIndex.find(val) == valToIndex.end()) {return false;}int lastElement = nums.back();int idxToRemove = valToIndex[val];nums[idxToRemove] = lastElement;valToIndex[lastElement] = idxToRemove;nums.pop_back();valToIndex.erase(val);return true;}int getRandom() {int randomIndex = rand() % nums.size();return nums[randomIndex];}
};

在这个实现中:

  • nums 是一个动态数组,用于存储集合中的元素。
  • valToIndex 是一个哈希表,用于将元素值映射到它们在 nums 中的索引。
  • insert 方法在 valToIndex 中检查元素是否存在。如果不存在,则将其添加到 nums 并更新 valToIndex
  • remove 方法首先检查元素是否存在。如果存在,将要删除的元素与 nums 中的最后一个元素交换,并更新 valToIndex 中的索引,然后从 numsvalToIndex 中删除该元素。
  • getRandom 方法从 nums 中随机选择一个元素并返回。

这个实现确保了 insert, removegetRandom 方法的时间复杂度均为 O(1)。

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

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

相关文章

软件测试编写文档模板【附文档模板】

一、测试岗位必备的文档 在一个常规的软件测试流程中&#xff0c;会涉及到测试计划、测试方案、测试用例、测试报告的编写&#xff0c;这些文档也是软件测试岗位必须掌握的文档类型。 1、测试计划 测试计划是组织管理层面的文件&#xff0c;从组织管理的角度对一次测试活动进…

设计模式-创建型模式之工厂设计模式

文章目录 五、工厂方法六、抽象工厂 五、工厂方法 工厂方法&#xff0c;使用工厂可以像使用人员屏蔽对象创建的细节&#xff0c;使用者无需指定具体的类即可使用功能&#xff0c;达到信息隐蔽的作用&#xff0c;便于后期的维护&#xff0c;修改和扩展。 在看工厂方法前还有一…

华纳云:linux中怎么实现apache安装与配置

在 Linux 系统中&#xff0c;安装和配置 Apache HTTP 服务器通常涉及以下步骤。以下以 Ubuntu 为例&#xff0c;其他 Linux 发行版的步骤也大致相同。 步骤 1&#xff1a;安装 Apache 打开终端并运行以下命令&#xff1a; sudo apt update sudo apt install apache2 步骤 …

Java实现堆

堆是一种基于完全二叉树的数据结构&#xff0c;它分为大根堆和小根堆。在大根堆中&#xff0c;每个节点的值都大于或等于其子节点的值&#xff1b;而在小根堆中&#xff0c;每个节点的值都小于或等于其子节点的值。 在Java中&#xff0c;我们可以使用数组来表示堆。由于完全二…

网工内推 | 云计算运维,云相关认证优先,最高30K,带薪年假

01 安畅网络 招聘岗位&#xff1a;云计算运维工程师 职责描述&#xff1a; 1、负责对公有云平台的计算、存储、网络资源等IAAS/SAAS/PAAS层产品组件日常交付部署运维工作&#xff0c;包括调试、配置、维护、监控、优化等工作&#xff1b; 2、负责对操作系统及应用日常运行维护…

MySQL事务详解

MySQL事务详解 数据库事务概述事务是如何实现的事务的ACID特性事务的状态 事务的使用显式事务隐式事务示例自动提交回滚回滚到保存点 事务的隔离级别数据并发问题MySQL 支持的四种隔离级别注意示例 设置隔离级别 事务的常见分类 数据库事务概述 数据库事务是数据库管理系统&am…

《山水间的家》第二季收官,国台酒业解锁中国式浪漫

执笔 | 洪大大 编辑 | 萧 萧 近日&#xff0c;由国台酒特别支持的大型文旅探访节目《山水间的家》第二季在总台央视综合频道&#xff08;CCTV-1&#xff09;正式收官。 第二季节目以家庭为视角切入&#xff0c;先后走进江苏、四川、重庆、江西、湖北、贵州、浙江等地24个特色…

Python subprocess模块的高级玩法

Python的subprocess模块是一个非常强大的工具&#xff0c;用于启动和与外部进程进行交互。它允许执行外部命令、访问系统Shell、管道数据、捕获输出和错误信息&#xff0c;以及更多。 本文详细介绍 subprocess模块的各个方面&#xff0c;包括如何执行外部命令、传递参数、处理…

Redis安装和部署详细流程

文章目录 一、Windows环境下安装 Redis1.1 下载Redis1.2 启动redis服务器1.3 启动redis客户端1.4 配置环境变量 参考资料 一、Windows环境下安装 Redis windows系统环境下&#xff0c;redis安装方式主要有&#xff1a; zip压缩包方式 https://redis.io/download 或者 https:/…

MMdetection3.0 问题

MMdetection3.0 问题 希望各位路过的大佬指教一下&#xff1a; 问题&#xff1a; 1、NWPU-VHR-10有标注的数据一共650张&#xff0c;我将其分为了455张训练集&#xff0c;195张验证集。 2、然后使用MMdetection3.0框架中的Faster-rcnn网络进行训练&#xff0c;设置训练参数b…

CityEngine2023 根据shp数据构建三维模型并导入UE5

目录 0 引言1 基本操作2 实践2.1 导入数据&#xff08;.shp&#xff09;2.2 构建三维模型2.3 将模型导入UE5 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;CityEngine专栏&#x1f4a5; 标题&#xff1a;CityEngine2023 根据shp数据构建三维模型…

Android问题笔记四十九:ViewPager 嵌套 Fragment 扩大滑动响应区域,避免左右滑动过于灵敏问题

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

finebi 新手入门案例

finebi 新手入门案例 连锁超市销售数据分析 步骤&#xff1a; 准备公共数据新建分析主题处理数据在数据中分析在图形中分析数据大屏 准备公共数据 点击公共数据 点击新建文件夹 修改文件夹名称 上传数据 鼠标悬停在文件夹上&#xff0c;右侧出现 鼠标悬停在文件夹上&#x…

git-5

1.GitHub为什么会火&#xff1f; 2.GitHub都有哪些核心功能&#xff1f; 3.怎么快速淘到感兴趣的开源项目 github上面开源项目非常多&#xff0c;为了我们高效率的找到我们想要的资源 根据时间 不进行登录&#xff0c;是没有办法享受到高级搜索中的代码功能的&#xff0c;登录…

maven 基础

maven常用命令 clean &#xff1a;清理 compile&#xff1a;编译 test&#xff1a;测试 package&#xff1a;打包 install&#xff1a;安装 maven坐标书写规范 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</ar…

改变生活,引领未来

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经深入到我们生活的各个角落&#xff0c;成为我们日常生活中不可或缺的一部分。它像一位魔术师&#xff0c;用其独特的“魔法”帮助我们解决问题、提供建议&#xff0c;甚至预测未来。本文将探讨人工智能如…

(Error Creating bean with name ‘xxx‘)类问题解决思路

学习springboot报错&#xff1a; Error creating bean with name com.atguigu.mybatislearning.MyBatisPlusServiceTest: Unsatisfied dependency expressed through field userService; 解决方式&#xff1a; 1、注解问题&#xff1a; Controller、service层的注解缺失会造…

链表中倒数第k个节点,剑指offer,力扣

目录 题目地址&#xff1a; 剑指offer原题&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 审题目事例提示&#xff1a; 解题思路&#xff08;双指针&#xff08;快慢指针&#xff09;&#xff09;&#xff1a; 代码实现&#xff1a; 代…

从功能测试到自动化测试,我总结了一些工作经验分享给大家

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【驱动】SPI驱动分析(三)-SPI关键数据类型

SPI数据类型 SPI控制器驱动结构体 struct spi_master抽象了控制器硬件&#xff0c;在SoC中的指的就是内部SPI控制器&#xff0c;当向SPI核心层注册一个SPI控制器时就需要提供这样的一个结构体变量。它的定义在 include/linux/spi/spi.h 文件&#xff0c;如下&#xff1a; /*…