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

发布时间:2026/7/10 15:05:24

LeetCode 380 O (1) 时间插入、删除和获取随机元素
一、题目核心要求需要实现三个操作全部平均时间复杂度 O (1)insert(val)插入元素存在返回 false不存在插入返回 trueremove(val)删除元素不存在返回 false存在删除返回 truegetRandom()随机等概率返回集合中一个元素单独容器的缺陷ArrayList动态数组尾部插入、随机访问 O (1)完美满足getRandom根据值查找、中间删除 O (n)无法满足 O (1) 删除HashMap/HashSet插入、删除、查找 O (1)不支持随机下标访问无法快速随机取元素核心解题思路双容器配合ArrayList nums存放所有数值依靠下标实现随机取值HashMap indkey 数值value 该数值在数组中的下标实现 O (1) 查找下标 两者互补全部操作做到平均 O (1)。二、代码逐段逻辑解析成员变量javaListInteger nums; // 存储所有元素用于随机访问 MapInteger,Integer ind; // 值 - 数组下标映射 Random random; // 生成随机下标构造方法初始化数组、哈希表、随机数工具。1. insert 插入逻辑javapublic boolean insert(int val) { if(ind.containsKey(val)){ return false; // 已存在插入失败 } int indexnums.size(); // 新元素放在数组末尾 nums.add(val); ind.put(val,index); // 记录值对应的下标 return true; }流程HashMap 判断元素是否存在去重新元素直接追加到数组尾部数组尾插 O (1)哈希表记录该值的下标。2. remove 删除数组中间删除会导致后续元素前移时间 O (n)优化技巧把待删除元素和数组最后一个元素交换再删除数组末尾数组尾删 O (1)。javapublic boolean remove(int val) { if(!ind.containsKey(val)){ return false; } // 1. 获取待删除元素下标 int indexind.get(val); // 2. 获取数组最后一个元素 int lastnums.get(nums.size()-1); // 3. 覆盖待删除位置 nums.set(index,last); // 4. 更新最后一个元素的下标映射 ind.put(last, index); // 5. 删除数组末尾、删除哈希表中val记录 nums.remove(nums.size()-1); ind.remove(val); return true; }关键步骤拆解拿到要删元素的下标index取出数组末尾元素last数组 index 位置覆盖为 last修改哈希表last 对应的下标改为 index数组删掉最后一位O (1)哈希表删掉 val3. getRandom 随机取值javapublic int getRandom() { int ranrandom.nextInt(nums.size()); return nums.get(ran); }random.nextInt(n)生成[0, n-1]均匀随机下标数组按下标访问 O (1)每个元素等概率。三、完整执行示例初始nums [2,5,7]ind{2:0,5:1,7:2}执行remove(5)index 1last 7nums.set(1,7) → nums [2,7,7]ind.put (7, 1) → 7 的下标更新为 1删除数组末尾nums [2,7]ind 删除 key5最终ind{2:0,7:1}四、易错细节删除时必须先更新末尾元素的下标映射再删数据如果先ind.remove(val)再更新 last 的下标逻辑直接出错。数组删除只能删末尾不能删中间元素nums.remove(index)是按下标删除中间元素会移位 O (n)绝对不能用。插入时新元素下标是nums.size()add 之前数组长度就是新元素的下标add 后长度 1。元素唯一HashMap 天然去重插入前必须判断containsKey。getRandom 依赖数组长度数组为空时题目保证不会调用。五、时间复杂度总结insertHashMap 存入 数组尾插 → O (1)removeHashMap 查找 / 修改 / 删除 数组尾删 → O (1)getRandom随机下标 数组下标访问 → O (1) 空间复杂度O (n)两个容器都存储全部元素。六、代码优缺点优点完全满足题目 O (1) 要求逻辑简洁删除交换尾部元素的优化是本题核心考点。可优化小细节变量命名可读性差ind→valToIndexRandom 实例全局复用无需重复创建当前写法没问题泛型可规范书写无语法错误。七、核心考点总结为什么不能只用 ArrayList / 只用 HashSet ArrayList 删除慢HashSet 不支持随机下标访问两者结合互补。删除操作为什么要和最后一个元素交换 数组尾部删除是 O (1)中间删除需要移动元素 O (n)交换规避移位。HashMap 在本题的作用 快速根据数值找到对应数组下标保证删除操作 O (1)。

相关新闻

dirmap高级Web目录扫描工具:从原理到实战的完整指南

dirmap高级Web目录扫描工具:从原理到实战的完整指南

2026/7/10 7:11:24

1. 项目概述如果你在安全测试或者渗透测试的圈子里待过一阵子,肯定对“目录扫描”这个词不陌生。简单来说,它就是拿着一个包含各种常见目录和文件名的“字典”,去一个个尝试访问目标网站,看看哪些路径是真实存在的。这活儿听起来简…

腾讯混元3.0免费上线:中文大模型工程落地新范式

腾讯混元3.0免费上线:中文大模型工程落地新范式

2026/7/6 3:54:47

1. 项目概述:一场不声不响却震得整个AI圈桌面发颤的发布“腾讯混元3.0大模型免费上线且性能猛增40%”——这行字刚在技术社区刷屏时,我正调试一个本地部署的Qwen2-7B推理服务,顺手点开混元官网控制台,输入邮箱、勾选协议、点击“立…

适配器模式(Adapter Pattern)属于**结构型设计模式**,其核心目的是**解决接口不兼容问题**

适配器模式(Adapter Pattern)属于**结构型设计模式**,其核心目的是**解决接口不兼容问题**

2026/7/7 23:15:30

适配器模式(Adapter Pattern)属于结构型设计模式,其核心目的是解决接口不兼容问题,通过创建一个适配器类(或对象)来“转换”一个类的接口,使其符合客户端所期望的另一个接口,从而让原…

语雀文档批量导出完整指南:轻松迁移知识库的终极解决方案

语雀文档批量导出完整指南:轻松迁移知识库的终极解决方案

2026/7/10 15:01:40

语雀文档批量导出完整指南:轻松迁移知识库的终极解决方案 【免费下载链接】yuque-exporter export yuque to local markdown 项目地址: https://gitcode.com/gh_mirrors/yuq/yuque-exporter 还在为如何将语雀上的宝贵文档安全备份到本地而烦恼吗?…

3步搞定B站4K视频下载:解锁大会员专属内容的神器

3步搞定B站4K视频下载:解锁大会员专属内容的神器

2026/7/10 15:01:40

3步搞定B站4K视频下载:解锁大会员专属内容的神器 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为B站大会员专属的4K…

PostgreSQL知识总结(九)| PostgreSQL的内置函数详细介绍

PostgreSQL知识总结(九)| PostgreSQL的内置函数详细介绍

2026/7/10 15:01:40

1.格式转换 1.1 格式转换符显示转换 利用双冒号可以直接进行格式转换,语法如下: 字段名或数值::数据类型 例子如下: -- 将文本123转为int8类型 SELECT 123 :: int8 num; -- 将文本类型字段t1转为int8类型 SELECT t1 :: int8 from temp;1.2 利用数据类型显示转换 利用数据…

linux环境GitLab服务部署安装及使用

linux环境GitLab服务部署安装及使用

2026/7/10 15:01:40

一、GitLab介绍 GitLab是利用Ruby onRails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。 二、GitLab安装 1、先安装相关依赖 yum -y install policycoreutils openssh-server openssh-clients postf…

Honey Select 2完整汉化与去码补丁终极指南:三步解决语言障碍和视觉限制

Honey Select 2完整汉化与去码补丁终极指南:三步解决语言障碍和视觉限制

2026/7/10 15:01:40

Honey Select 2完整汉化与去码补丁终极指南:三步解决语言障碍和视觉限制 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 你是否曾经因为日文界面而错…

Compressor.js:浏览器端图像压缩技术的架构演进与实践范式

Compressor.js:浏览器端图像压缩技术的架构演进与实践范式

2026/7/10 14:51:39

Compressor.js:浏览器端图像压缩技术的架构演进与实践范式 【免费下载链接】compressorjs JavaScript image compressor. 项目地址: https://gitcode.com/gh_mirrors/co/compressorjs 在Web应用性能优化的技术栈中,图像处理一直占据着关键位置。随…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/9 19:40:56

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/9 18:28:30

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/10 6:57:56

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

终极原神FPS解锁器完整指南:轻松突破60帧限制

终极原神FPS解锁器完整指南:轻松突破60帧限制

2026/7/10 0:00:42

终极原神FPS解锁器完整指南:轻松突破60帧限制 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 原神FPS解锁器是一款专为《原神》玩家设计的开源工具,通过先进的Wri…

YesPlayMusic:如何用高颜值播放器重塑你的网易云音乐体验?[特殊字符]

YesPlayMusic:如何用高颜值播放器重塑你的网易云音乐体验?[特殊字符]

2026/7/10 0:00:42

YesPlayMusic:如何用高颜值播放器重塑你的网易云音乐体验?🎵 【免费下载链接】YesPlayMusic 高颜值的第三方网易云播放器,支持 Windows / macOS / Linux :electron: 项目地址: https://gitcode.com/gh_mirrors/ye/YesPlayMusic…

从零实现红黑树:手写C++的set与map容器

从零实现红黑树:手写C++的set与map容器

2026/7/10 0:00:42

1. 项目概述:从STL容器到自研轮子在C的日常开发中,std::set和std::map是我们再熟悉不过的伙伴了。它们一个负责管理不重复的集合,一个负责维护键值对映射,底层都依赖一颗高效的红黑树来保证数据的有序性和操作的性能。但你是否曾想…