面试算法30:插入、删除和随机访问都是O(1)的容器
题目
设计一个数据结构,使如下3个操作的时间复杂度都是O(1)。
- insert(value):如果数据集中不包含一个数值,则把它添加到数据集中。
- remove(value):如果数据集中包含一个数值,则把它删除。
- getRandom():随机返回数据集中的一个数值,要求数据集中每个数字被返回的概率都相同。
分析
由于题目要求插入和删除(包括判断数据集中是否包含一个数值)的时间复杂度都是O(1),能够同时满足这些时间效率要求的只有哈希表,因此这个数据结构要用到哈希表。但是如果只用哈希表,则不能等概率地返回其中的每个数值。
如果数值是保存在数组中的,那么很容易实现等概率返回数组中的每个数值。假设数组的长度是n,那么等概率随机生成从0到n-1的一个数字。如果生成的随机数是i,则返回数组中下标为i的数值。由此可以发现,需要结合哈希表和数组的特性来设计这个数据容器。
由于数值保存在数组中,因此需要知道每个数值在数组中的位置,否则在删除的时候就必须顺序扫描整个数组才能找到待删除的数值,那就需要O(n)的时间。通常把每个数值在数组中的位置信息保存到一个HashMap中,HashMap的键是数值,而对应的值为它在数组中的位置。
解
public class Test {public static void main(String[] args) {RandomizedSet randomizedSet = new RandomizedSet();randomizedSet.insert(1);randomizedSet.insert(2);randomizedSet.insert(3);randomizedSet.insert(4);for (int i = 0; i < randomizedSet.nums.size(); i++) {System.out.println(randomizedSet.nums.get(i));}System.out.println("-----------------------");randomizedSet.remove(2);for (int i = 0; i < randomizedSet.nums.size(); i++) {System.out.println(randomizedSet.nums.get(i));}System.out.println("-----------------------");System.out.println(randomizedSet.getRandom());}static class RandomizedSet {HashMap<Integer, Integer> numToLocation;ArrayList<Integer> nums;public RandomizedSet() {numToLocation = new HashMap<>();nums = new ArrayList<>();}public boolean insert(int val) {if (numToLocation.containsKey(val)) {return false;}numToLocation.put(val, nums.size());nums.add(val);return true;}public boolean remove(int val) {if (!numToLocation.containsKey(val)) {return false;}int location = numToLocation.get(val);numToLocation.put(nums.get(nums.size() - 1), location);numToLocation.remove(val);nums.set(location, nums.get(nums.size() - 1));nums.remove(nums.size() - 1);return true;}public int getRandom() {Random random = new Random();int r = random.nextInt(nums.size());return nums.get(r);}}
}
相关文章:
面试算法30:插入、删除和随机访问都是O(1)的容器
题目 设计一个数据结构,使如下3个操作的时间复杂度都是O(1)。 insert(value):如果数据集中不包含一个数值,则把它添加到数据集中。remove(value):如果数据集…...
Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致
一、前言 在很多软件上,会在某个部位显示一个部件,专门显示当前的CPU使用率以及内存占用,方便用户判断当前程序或者当前环境中是否还有剩余的CPU和内存留给程序使用,在不用打开任务管理器或者资源查看器的时候直接得知当前系统的…...
win32汇编-使用子程序
当程序中相同功能的一段代码用得比较频繁时,可以将它分离出来写成一个子程序,在主程序中用call指令来调用它。这样可以不用重复写相同的代码, 仅仅用call指令就可以完成多次同样的工作了。Win 32汇编中的子程序也采用堆栈来传递参数ÿ…...
【论文阅读】 Cola-Dif; An explainable task-specific synthesis network
文章目录 CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI SynthesisAn Explainable Deep Framework: Towards Task-Specific Fusion for Multi-to-One MRI Synthesis CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI Synthesis 论文…...
ShareMouse for Mac(多台电脑鼠标键盘共享软件)
ShareMouse mac版是一款Mac平台上可以在多台电脑间共享鼠标的工具软件,sharemousefor Mac支持 Windows 与 Mac,并可以在不同电脑间共享剪贴板。只需要移动鼠标指针的到想控制的显示器那里去、鼠标光标就会神奇地“跨越”到邻近的电脑屏幕上。每个计算机都…...
中文编程开发语言工具开发案例:多种称重方式编程实际例子
中文编程开发语言工具开发案例:多种称重方式编程实际例子 上图为 计价秤,使用串口通讯线连接电脑的主机,软件自动读取称的重量,自动计算金额。这种方式称重快速,不需再打印条码。 上图这个称重方式为 一体称称重&#…...
国密sm2的Vue、Python、Java互通使用
目录 一、Vue 二、Python 三、Java 一、Vue # npm install --save sm-cryptoimport {sm2} from sm-crypto const cipherMode 1 const private_key d9d37f4f46e8514c6f9398a984e74f3eead994e8f4ac5f92e5deb313cb5ad6a6 const public_key 04 e332ee43ac37be458550652fb9…...
如何通过SK集成chatGPT实现DotNet项目工程化?
智能助手服务 以下案例将讲解如何实现天气插件 当前文档对应src/assistant/Chat.SemanticServer项目 首先我们介绍一下Chat.SemanticServer的技术架构 SemanticKernel 是什么? Semantic Kernel是一个SDK,它将OpenAI、Azure OpenAI和Hugging Face等大…...
DRM中render-node编号的分配
DRM系统 DRM是direct rendering manager的简称。DRM是linux kernel中与负责video cards功能的GPU打交道的子系统。DRM给出了一组API,可以供用户程序来发送命令和数据给GPU设备从而来控制比如display、render等功能。 render-node由来 在以前,DRM子系统…...
将输入对象转换为数组数组的维度大于等于1numpy.atleast_1d()
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将输入对象转换为数组 数组的维度大于等于1 numpy.atleast_1d() 选择题 使用numpy.atleast_1d()函数,下列正确的是? import numpy as np a1 1 a2 ((1,2,3),(4,5,6)) print("…...
js 删除树状图无用数据,如果子级没有数据则删除
有一个需求,当你从后端拿到一个树状图的时候,有些子级没数据,这时就需要我们处理一下数据,当然了,如果第一层底下的第二层没数据,第二层底下的所有都没数据,那这一层都不需要。 我的写法&#x…...
Docker 容器化(初学者的分享)
目录 一、什么是docker 二、docker的缺陷 三、简单的操作 一、首先配置一台虚拟机 二、安装Docker-CE 一、安装utils 二、 将 Docker 的软件源添加到 CentOS 的 yum 仓库中。这样可以通过 yum 命令来安装、更新和管理 Docker 相关的软件包。 三、将 download.docker.co…...
LCS 01.下载插件
题目来源: leetcode题目,网址:写文章-CSDN创作中心 解题思路: 假设需要 n 分钟下载插件,前 n-1 分钟将带宽加倍,最后一分钟下载时总时间最少。 解题代码: class Solution { public:int l…...
架构-设计原则
1、面向对象的SOLID 1.1 概述 SOLID是5个设计原则开头字母的缩写,其本身就有“稳定的”的意思,寓意是“遵从SOLID原则可以建立稳定、灵活、健壮的系统”。5个原则分别如下: Single Responsibility Principle(SRP)&am…...
在 Python 3 中释放 LightGBM 的力量:您的机器学习大师之路
机器学习是 Python 占据主导地位的领域,它一直在给全球各行各业带来革命性的变化。要在这个不断变化的环境中脱颖而出,掌握正确的工具是关键。LightGBM 就是这样一个工具,它是一个强大且快速的梯度提升框架。在这份综合指南中,我们将通过实际示例和示例数据集从基础知识到高…...
Spring学习笔记(2)
Spring学习笔记(2) 一、Spring配置非定义Bean1.1 DruidDataSource1.2、Connection1.3、Date1.4、SqlSessionFactory 二、Bean实例化的基本流程2.1 BeanDefinition2.2 单例池和流程总结 三、Spring的bean工厂后处理器3.1 bean工厂后处理器入门3.2、注册Be…...
cmd使用ssh连接Linux脚本
前言 在开发过程中,由于MobaXterm,我不知道怎么分页(不是屏内分页),用crtlTab,用起来不习惯,主要是MobaXterm连接了多个服务器,切换起来很麻烦。我是比较习惯使用altTab,…...
Python万圣节蝙蝠
目录 系列文章 前言 蝙蝠 程序设计 程序分析 运行结果 尾声 系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want5…...
TCP流套接字编程
文章目录 前言TCP 和 UDP 的特点对比TcpEchoServer 服务端实现1. 创建 ServerSocket 类实现通信双方建立连接2. 取出建立的连接实现双方通信3. 服务端业务逻辑实现关闭资源服务端整体代码 TcpEchoClient 客户端实现1. 创建出 Socket 对象来与服务端实现通信2. 实现客户端的主要…...
Python迭代器创建与使用:从入门到精通
一、可迭代对象 1、 什么是可迭代对象? 表示可以逐一迭代或者遍历的对象,序列:列表、元组、集合、字符串。非序列:字典、文件。自定义对象:实现了__iter__()方法的对象;实现了使用整数索引的 getitem()方…...
城通网盘限速破解终极指南:ctfileGet工具让你免费享受10倍下载速度
城通网盘限速破解终极指南:ctfileGet工具让你免费享受10倍下载速度 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾经被城通网盘的限速下载折磨得痛不欲生?面对几十KB/s…...
【原创改进代码】考虑电动汽车移动储能特性的多区域电网功率波动平抑优化调控附python代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子…...
Vivado Design Suite中BUFG优化策略与实战技巧
1. 理解BUFG的核心作用与设计痛点 在FPGA设计中,时钟信号就像人体神经系统中的电脉冲,需要快速、准确地传递到每个功能单元。BUFG(全局时钟缓冲器)就是Xilinx器件中专用的"信号放大器",它能将时钟信号分配到…...
TEMOS
TEMOS(Text-conditioned Motion Synthesis)是2022年提出的一个文本驱动动作生成模型,核心设计是:文本编码器 动作编码器 动作解码器输入文本描述 → 生成对应的3D动作序列训练时用 KL 散度损失让文本和动作的隐空间分布对齐&…...
MotorController:嵌入式伺服电机驱动的确定性执行封装
1. 项目概述MotorController是一个面向伺服系统电机控制的轻量级工具类,其设计目标并非替代完整的运动控制固件栈,而是为嵌入式工程师提供一套可直接集成、低侵入、高可控性的底层电机驱动封装。该类不依赖特定硬件抽象层(HAL)或实…...
Vue 组态化管道流动效果:从零构建现代化流体模拟系统
1. 为什么需要管道流动模拟系统 在工业自动化和教学演示领域,可视化管道系统是一个常见需求。想象一下化工厂的液体输送管道、城市供水系统或者实验室的流体实验装置,这些场景都需要直观展示流体在管道中的流动状态。传统做法是使用静态图片或简单动画&a…...
GT New Horizons材质包精选:10款提升沉浸体验的视觉升级方案
GT New Horizons材质包精选:10款提升沉浸体验的视觉升级方案 【免费下载链接】GT-New-Horizons-Modpack A big progressive questing modpack for Minecraft 1.7.10 balanced around the mod GregTech. 项目地址: https://gitcode.com/GitHub_Trending/gt/GT-New-…...
SSM+Vue大学生兼职网站源码+论文
代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择: 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...
你的企业还在靠人工处理重复工作?同行已经用 AI 释放人力了 | 2026企业数字化转型指南:基于实在Agent的端到端自动化解决方案
在2026年的数字化浪潮中,企业间的竞争已经从“资源规模”转向了“响应速度”。 当多数企业还在为报表合并、数据搬运、跨系统审核等重复性劳动耗费大量人力时, 领先的行业标杆已经开始通过智能体技术重构底层作业逻辑。 这种转变不仅是工具的更替&#x…...
CSS 容器查询:组件级响应式设计
CSS 容器查询:组件级响应式设计代码如诗,容器如画。让我们用容器查询的强大能力,创建真正自适应的组件。什么是容器查询? 容器查询(Container Queries)是 CSS 中一项革命性的特性,它允许我们根据…...
