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

题目链接

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

题目描述


注意点

  • 在调用 getRandom 方法时,数据结构中 至少存在一个 元素
  • 满足每个函数的 平均 时间复杂度为 O(1)

解答思路

  • 因为要满足满足每个函数的平均时间复杂度为 O(1),只使用List新增和删除的时间复杂度为O(n),只使用Map获取随机元素的时间复杂度为O(n)。所以考虑使用List+Map,其中List存储元素值,Map中key存储元素值,value存储元素在List中的下标
  • 在新增元素时,直接将元素添加到List末尾,往Map中存储元素相应信息即可
  • 在删除元素时,有以下几个步骤:
    • 通过Map获取元素在List中的下标idx
    • 将List中tail的元素与idx的元素进行交换
    • 将Map中tail元素的value修改为idx
    • 删除List和Map中的元素
  • 获取随机元素使用random获取List范围中的元素即可

代码

class RandomizedSet {// key->值,value->值在list中的下标Map<Integer, Integer> map;List<Integer> list;Random random;public RandomizedSet() {map = new HashMap<>();list = new ArrayList<>();random = new Random();}public boolean insert(int val) {if (map.get(val) != null) {return false;}list.add(val);map.put(val, list.size() - 1);return true;}public boolean remove(int val) {if (map.get(val) == null) {return false;}// 获得val在list中的下标idxint idx = map.get(val);int tail = list.size() - 1;// list->idx和tail交换,交换后删除taillist.set(idx, list.get(tail));// map->更新tail处元素对应的value,删除valmap.put(list.get(tail), idx);list.remove(tail);map.remove(val);return true;}public int getRandom() {int randomIdx = random.nextInt(list.size());return list.get(randomIdx);}
}/*** 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();*/

关键点

  • 使用List+Map存储元素
  • 删除元素的几个步骤

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

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

相关文章

芯品荟 | 酒精测试仪市场调研报告

产品简介 酒精检测仪是一种可以测量人体酒精浓度的电子设备。 它可以通过呼气或血液等方式来检测酒精浓度&#xff0c;被广泛应用于交通安全、职业健康等领域。 酒精检测仪的工作原理&#xff1a; 1、酒精检测仪分为2种&#xff0c;基于化学传感器与基于光学传感器&#xff…

k8s-Pod编排与调度

一、无状态负载 (Deployment) 1.1 背景 Pod是K8s调度的最小单元&#xff0c;但是Pod可能因为资源不足、集群崩溃等被驱逐。Controller Manage会管理Pod&#xff0c;完成Pod自愈、滚动升级等操作&#xff0c;通过Deployment这种资源完成Pod维护。 一个Deployment可以包含一个或…

阿里云云原生弹性方案:用弹性解决集群资源利用率难题

作者&#xff1a;赫曦 随着上云的认知更加普遍&#xff0c;我们发现除了以往占大部分的互联网类型的客户&#xff0c;一些传统的企业&#xff0c;一些制造类的和工业型企业客户也都开始使用云原生的方式去做 IT 架构的转型&#xff0c;提高集群资源使用率也成为企业上云的一致…

fastJson和jackson的日期数据处理

目录 1.jackson 2.fastjson 3.总结 1.jackson jackson是spring mvc默认的JSON解析方法&#xff0c;前端的数据序列化处理之后&#xff0c;后端经过反序列化处理可以直接使用实体对象进行接收。后端接口返回实体对象&#xff0c;经过序列化处理后前端可以接收并进行处理。 …

Java设计模式详解

各位大家好&#xff0c;从今天开始&#xff0c;作者开始整理 《JAVA软件设计模式&#xff08;GOF&#xff09;》 专栏。请各位多多关注&#xff01; 该专栏是根据作者的技术经验和设计模式的了解&#xff0c;进行详细的讲解。讲解过程中&#xff0c;会增入作者的一些个人观点和…

javaScript设计模式-工厂

它的好处是消除对象间的耦合度&#xff0c;在派生子类时提供了更大的灵活性。但盲目的把普通的构造函数扔在一边&#xff0c;并不值得提倡。如果要采一不可能另外换用一个类&#xff0c;或都不需要在运行期间在一系列可互换的类中进行选择&#xff0c;就不应该使用。这样在后期…

计算机网络-ACL访问控制列表

上一篇介绍NAT时候就看到了ACL这个东西了&#xff0c;这个是什么意思&#xff1f;有什么作用呢&#xff1f; 一、ACL访问控制列表 访问控制列表 (ACL, Access Control List)是由一系列permit或deny语句组成的、有序规则的列表。ACL是一个匹配工具&#xff0c;能够对报文进行匹配…

【Linux系列】在Pop!OS的启动器中添加自定义程序图标

文章目录 前言一、创建快捷方式二、快捷方式参数三、添加右键菜单和注册MIME 前言 无论是在Windows上&#xff0c;还是Linux&#xff0c;或者安卓这些我们常用的操作系统上&#xff0c;一些应用程序的快捷方式放在桌面或者启动器&#xff0c;只需要简单的点击就可以启动&#…

Python实现自动化办公(使用第三方库操作Excel)

1 使用 xlrd 读取Excel数据 1.1 获取具体单元格的数据 import xlrd# 1. 打开工作簿 workbook xlrd.open_workbook("D:/Python_study_projects/Python自动化办公/Excel/test1.xlsx") # 2. 打开工作表 sheet1 workbook.sheets()[0] # 选择所有工作表中的第一个 # …

css-动画效果学习示例

阴影 x-轴 y-轴 模糊度 颜色 (正负值可以表示角度问题) 可以加多个阴影 内置阴影 transition 可以添加动画延迟效果 向z轴缩进&#xff0c;开启透视respective 触发旋转效果 学习来源 &#xff1a;动画属性_哔哩哔哩_bilibili

vscode导出、导入全部插件

导出插件 code --list-extensions > plugins导入插件 将要导入的插件文本位置与终端位置一致 Get-Content plugins | ForEach-Object { code --install-extension $_ }在VSCode中导出安装的所有插件并在其他计算机进行导入-CSDN博客

ssb-PositionsInBurst的含义

UE在idle 初始接入过程&#xff0c;首先根据支持band的情况进行底层扫频&#xff0c;decode 到SIB1时&#xff0c;可以通过ssb-PositionsInBurst 确定当前小区对应的SSB 数量信息。 那ssb-PositionsInBurst是什么意思&#xff1f;接下来就来看下。 inOneGroup(8bits): 当每半帧…