380. O(1) 时间插入、删除和获取随机元素【 力扣(LeetCode) 】
一、题目描述
实现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 。
三、解题思路
- 基本思路:
在插入和删除操作中,都需要先查找元素,查找元素需要 O ( 1 ) \Omicron(1) O(1) 的复杂度,只能考虑散列表,可以使用 map 进行映射;插入比较简单,只要在序列头或者尾插入都是 O ( 1 ) \Omicron(1) O(1) ,删除需要 O ( 1 ) \Omicron(1) O(1) 的话,可以考虑用尾部元素来填充需要被删除的元素;随机查找操作则需要利用元素的下标进行访问,则可以考虑数组,但数组大小固定,所以可以考虑向量 vector ;综上所述,数据结构就考虑 map 与 vector 结合。【类似游标数组的思想】 - 具体思路:
- 初始化:无;
- 插入元素:判断该元素是否存在,不存在则在 vector 尾部添加元素,同时记录元素的下标和元素值,按 <值,下标> 的映射关系存入 map;
- 删除元素:判断该元素是否存在,存在则利用 map 得到该元素的下标,对于 vector ,将该下标的元素用最后一个元素填充,然后删除最后一个元素;对于 map ,修改 vector 最后一个元素的映射关系,然后删除要删除的元素的映射关系;
- 随机查找:利用 rand 生成随机数,对 vector 的大小求余,然后访问对应元素。
四、参考代码
时间复杂度: O ( 1 ) \Omicron(1) O(1)
空间复杂度: O ( n ) \Omicron(n) O(n)
#include <map>
class RandomizedSet {
public:vector<int> index_num;std::map<int,int> num_index;RandomizedSet() {}bool insert(int val) {if(num_index.count(val)){return false;}else{index_num.push_back(val);num_index[val]=index_num.size()-1;return true;}}bool remove(int val) {if(num_index.count(val)==0){return false;}else{int index=num_index[val];int num=index_num[index_num.size()-1];index_num[index]=num;index_num.pop_back();num_index[num]=index;num_index.erase(val);return true;}}int getRandom() {return index_num[rand()%index_num.size()];}
};相关文章:
380. O(1) 时间插入、删除和获取随机元素【 力扣(LeetCode) 】
一、题目描述 实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。bool remove(int val) 当元素 val 存…...
【每日刷题】Day91
【每日刷题】Day91 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 面试题 05.07. 配对交换 - 力扣(LeetCode) 2. 面试题 08.05. 递归乘法 - 力…...
数据库索引的创建和使用
数据库索引数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度。索引优化是数据库优化的最重要手段。 如果查询语句使用索引(通常是where条件匹配索引)就会利用…...
光流传感器 - 从零开始认识各种传感器【第二十二期】
光流传感器|从零开始认识各种传感器 1、什么是光流传感器 光流传感器是一种用于测量物体相对于周围环境的运动的设备。它通过检测周围光线的变化来计算出物体的运动方向和速度,广泛应用于机器人导航、无人机飞行控制、虚拟现实等领域。 2、光流传感器是如何工作的…...
爬虫:jsonpath模块及腾讯招聘数据获取
目录 jsonpath模块 腾讯招聘数据获取 jsonpath模块 # pip install jsonpath -i https://pypi.tuna.tsinghua.edu.cn/simple import jsonpathdata {"store": {"book":[{"category": "reference","author": "Nigel Ree…...
透明屏幕的显示原理与特点
透明屏幕,特别是透明LED显示屏,以其独特的显示效果和通透性在现代建筑和广告领域中逐渐崭露头角。它既能提供视觉显示,又不影响采光效果,成为建筑立面和商场橱窗等场景的理想选择。那么,透明屏幕的显示原理是什么&…...
[Day 41] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
去中心化金融(DeFi)是一個利用區塊鏈技術來構建去中心化的金融系統的運動。它旨在通過智能合約和去中心化應用(DApps)來提供傳統金融系統中的各種服務,如貸款、儲蓄、保險、交易等,而不依賴於中心化的機構。…...
PHP表单验证
PHP 表单验证是确保用户输入数据符合特定要求的关键步骤,它有助于维护数据的完整性和准确性,同时提高应用的安全性。以下是一个详细的 PHP 表单验证教程: 一、表单的创建 首先,你需要在 HTML 文档中创建一个表单。表单包含输入字…...
英文文献翻译软件有哪些?知道这5款工具就够了
对于那些致力于科研、教育或国际业务的人来说,英文文献往往是获取前沿知识的关键。 然而,语言的障碍往往成为一道难以逾越的鸿沟。幸运的是,科技的进步带来了众多翻译工具,它们不仅能够帮助我们理解外语内容,还能直接…...
单线程 和多线程区别,看打印输出1000个数字效果
执⾏过程: 加载func() -> 执⾏main -> 创建⼦线程t -> ⼦线程t启动 -> 执⾏func中的内容 |-> 继续执⾏main from threading import Thread #此线程不用安装自带。T是大写注意哟 def func():for i in range(1000):print(func,i) #定义一个函数打印 if __name__ …...
【问题处理】海康视频websocket代理问题(websocket在业务系统https协议下调用海康ws协议)
简介 本文记录一次海康视频代理websocket 在https业务系统环境下调用海康服务ws协议的问题。 问题描述 起初前端组件展示视频时,业务系统使用的环境是https,此时海康服务调用时,使用的是ws协议,最后前端控制台报错:…...
【面试分享】面试题——redis
一、题目 Redis的数据持久化策略有哪些什么是缓存穿透,怎么解决什么是布隆过滤器什么是缓存击穿,怎么解决什么是缓存雪崩,怎么解决redis双写问题Redis分布式锁如何实现Redis实现分布式锁如何合理的控制锁的有效时长Redis的数据过期策略有哪些…...
GLSL教程 第十三章:综合项目:创建一个完整的渲染场景(一更)
目录 13.1 项目规划和设计 13.1.1 项目目标 13.1.2 设计要求 13.2 实现场景中的光照、材质和纹理 13.2.1 创建基础场景 13.2.2 应用材质和纹理 13.3 集成高级渲染效果和后期处理 13.3.1 阴影映射(Shadow Mapping) 13.3.2 环境光遮蔽(AO) 13.3.3 简单的景深效果(…...
pgvector: 30 倍构建向量嵌入索引
使用 pgvector 为 HNSW 并行构建索引 Postgres 最受欢迎的向量搜索扩展 pgvector 最近实现了并行索引构建功能,这将分层可导航小世界 (HNSW) 索引构建时间显著提高了 30 倍。 祝贺 Andrew Kane 和 pgvector 的贡献者发布此版本,这巩固了 Postgres 作为最…...
GNSS形变监测系统
TH-WY1 GNSS形变监测系统采用扼流圈设计有以下几个优势: 高精度测量:扼流圈是一种高精度的传感器,可以提供非常精确的测量结果。这使得GNSS形变监测系统能够准确地测量结构物的形变变化。 高稳定性:扼流圈设计使得传感器具有良好…...
每天一个数据分析题(四百五十三)- 随机抽样
在进行随机抽样时由于某些原因会产生抽样误差,以下关于抽样误差的说法,正确的是 A. 抽样误差是随机抽样调查中偶然发生的代表性误差 B. 抽样误差的大小同样本单位数成正比关系 C. 简单随机抽样比分层抽样误差大 D. 重复抽样比不重复抽样误差小 数据…...
Python爬虫知识体系-----Selenium
数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新:https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、安装和基本使用二、元素定位三、访问元素信息四、自动化交互五、PhantomJS六、Chrome headless 一、安装和基本使用…...
springboot+webSocket对接chatgpt
webSocket对接参考 话不多说直接上代码 WebSocket package com.student.config;import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springfram…...
【ROS2】 默认的DDS通信中间件替换为Eclipse Cyclone_DDS (DDS配置方法)
ROS2替换中间件为Cyclone_DDS 1.一些介绍:)2.不同DDS的RMW实现3.默认的FastDDS替换为Cyclone DDSi.安装依赖ii.编译 cyclone-dds 4.配置网络 1.一些介绍:) 上一篇我们探讨了ros1和ros2编写launch的区别 【ROS2】launch启动文件编…...
迈向数智金融:机器学习金融科技新纪元的新风采
个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
