JAVA练习365- O(1) 时间插入、删除和获取随机元素
题目概览实现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 。提示-2^31 val 2^31 - 1最多调用insert、remove和getRandom函数2 *10^5次在调用getRandom方法时数据结构中至少存在一个元素。来源380. O(1) 时间插入、删除和获取随机元素 - 力扣LeetCode解题分析方法哈希插入和删除可以用通过集合来实现由于集合是乱序的因此我们需要一个有序集合来存储每个元素由于这里给出了最多调用 20000 次我们可以用长度为 20000 的数组代替那么维护一个变量 index记录当前数组索引集合用 map 实现key 为 valvalue 为 index插入时插入 mapnums[ index ] valindex删除时删除 map 对应 val 的键值对并记录对应索引 cur将数组对应索引值设置为数组最后一个即 nums[cur] nums[index]然后 index--。随机获取时生成 [ 0i的随机值即可时间复杂度O(1)空间复杂度O(n)class RandomizedSet { static int[] nums new int[200001]; Random random new Random(); MapInteger, Integer map new HashMap(); int i -1; public RandomizedSet() { } public boolean insert(int val) { if (map.containsKey(val)) { return false; } nums[i] val; map.put(val, i); return true; } public boolean remove(int val) { if (!map.containsKey(val)) { return false; } int index map.remove(val); if (index i) { i--; return true; } nums[index] nums[i--]; map.put(nums[index], index); return true; } public int getRandom() { int ran random.nextInt(i1); return nums[ran]; } } /** * 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(); */

相关新闻

图数据结构与算法实战:从基础到工程优化

图数据结构与算法实战:从基础到工程优化

1. 图数据结构基础概念解析 图(Graph)作为数据结构中的"瑞士军刀",是描述实体间复杂关系的终极武器。不同于线性结构的串行排列和树形结构的层级约束,图以节点(Vertex)和边(Edge&…

2026/10/24 2:40:42 阅读更多 →
实验报告撰写规范与核心内容梳理指南

实验报告撰写规范与核心内容梳理指南

搞科研的大家!找英文文献依然是科研路上最头疼的一道坎儿吧? 尤其是现在AI工具层出不穷,老工具也在不断升级,选对平台能省下大把时间。今天我给大家盘点8个好用的英文文献检索网站,涵盖传统权威平台 新一代AI智能工具…

2026/10/25 2:09:29 阅读更多 →
蔬菜配送系统怎么选?同行都在推的靠谱报价,认准菜东家

蔬菜配送系统怎么选?同行都在推的靠谱报价,认准菜东家

做蔬菜配送这行,内行都懂:赚的是辛苦钱,亏的是管理漏洞。每天凌晨分拣、多客户调价、账期混乱、损耗算不清、错单漏单频发……很多老板不是生意不赚钱,而是人工管不住、账目对不上、效率提不上。现在同行圈子里有个共识&#xff1…

2026/10/25 9:18:12 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/2 0:25:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/2 10:46:11 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/2 10:47:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/2 1:16:51 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/2 10:46:31 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/2 10:46:26 阅读更多 →

日新闻

周新闻

月新闻