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 🕊️系列专栏:🖼️…...
Win11Debloat:Windows系统轻量优化解决方案
Win11Debloat:Windows系统轻量优化解决方案 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简化和改善你的Win…...
C语言回调函数在TCP客户端中的实现与应用
C语言回调函数在TCP客户端中的实现与应用1. 回调函数基础概念回调函数是一种通过函数指针实现的编程机制,允许将一个函数作为参数传递给另一个函数。在C语言中,回调函数的实现完全依赖于函数指针,这与C、Python等现代语言中可能使用仿函数或匿…...
STM32 RTC硬件自检工具CheckRTC:轻量级实时时钟可信度验证
1. 项目概述CheckRTC 是一个面向 STM32 系列微控制器的轻量级 RTC(实时时钟)模块自检与功能验证程序。其核心目标并非提供通用 RTC 驱动,而是作为嵌入式底层开发中关键的硬件可信度验证工具——在系统启动早期、固件升级后、或长期运行出现时…...
云效流水线实战:从零部署Java应用到阿里云ECS(含完整脚本)
云效流水线实战:从零部署Java应用到阿里云ECS(含完整脚本) 在当今快节奏的软件开发环境中,自动化部署已成为提升团队效率的关键环节。阿里云云效平台提供的流水线功能,为开发者提供了一套完整的CI/CD解决方案ÿ…...
【Python内存管理终极指南】:20年专家亲授智能体内存优化的5大核心配置步骤
第一章:Python智能体内存管理的底层原理与认知重构Python 的内存管理并非由开发者显式控制,而是通过一套高度协同的自动化机制实现——它融合了引用计数、循环垃圾回收(GC)与内存池(pymalloc)三层结构。这种…...
密码安全必修课:为什么BCrypt比MD5更适合存储用户密码?
密码安全必修课:为什么BCrypt比MD5更适合存储用户密码? 在数字身份成为第二张身份证的时代,密码安全早已不是技术圈的内部话题。去年某社交平台600万用户数据泄露事件中,令人震惊的不是数据被盗本身,而是其中87%的密码…...
MinerU本地部署安全吗?数据隐私保护实战配置
MinerU本地部署安全吗?数据隐私保护实战配置 1. 引言:当AI遇见你的敏感文档 想象一下这个场景:你有一份包含商业机密的合同PDF,或者一份涉及个人隐私的医疗报告扫描件。你想用AI快速提取里面的关键信息,但又担心把文…...
微软服软!被骂5年的Win11将被“整改”:告别强制更新、减少Copilot、任务栏摆放自由
整理 | 屠敏出品 | CSDN(ID:CSDNnews)Windows 11 自 2021 年发布以来,因任务栏功能缩水、UI 不统一、强制网络登录以及更高的硬件门槛,成为用户集中吐槽的焦点。再加上近来微软猛推 AI 功能,Copilot 的入口…...
M.2 SSD硬件电路设计实战:从接口规范到高速信号布局
1. M.2 SSD硬件设计入门:从接口规范说起 第一次接触M.2 SSD设计时,我被各种接口类型和协议搞得晕头转向。现在回想起来,其实只要抓住几个关键点就能快速上手。M.2接口作为Intel推出的新一代存储标准,已经全面取代了老旧的mSATA接口…...
FPGA设计避坑指南:手把手教你搞定跨时钟域信号同步(附Verilog代码)
FPGA设计避坑指南:跨时钟域信号同步的工程实践与Verilog实现 在FPGA开发中,跨时钟域信号同步问题就像电路设计中的"暗礁",稍有不慎就会导致整个系统崩溃。想象一下这样的场景:你的设计在仿真阶段完美运行,但…...
