首页 > 其他分享 >380. O(1) 时间插入、删除和获取随机元素

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

时间:2023-10-24 18:44:24浏览次数:29  
标签:randomizedSet false val nums getRandom 380 插入 随机 true

实现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 。

代码


class RandomizedSet {
public:
    RandomizedSet() {}
    bool insert(int val) {
        if (m.count(val)) return false;
        nums.push_back(val);
        m[val] = nums.size() - 1;
        return true;
    }
    bool remove(int val) {
        if (!m.count(val)) return false;
        int last = nums.back();
        m[last] = m[val];
        nums[m[val]] = last;
        nums.pop_back();
        m.erase(val);
        return true;
    }
    int getRandom() {
        return nums[rand() % nums.size()];
    }
private:
    vector<int> nums;
    unordered_map<int, int> m;
};

标签:randomizedSet,false,val,nums,getRandom,380,插入,随机,true
From: https://www.cnblogs.com/lihaoxiang/p/17785500.html

相关文章

  • 关于程序中插入二进制文件
    若要在程序中插入二进制文件,需要将插入的二进制文件与启动文件放在同一路径下,然后在启动文件中调用.incbin"TEST.BIN"指令即可,如下图:编译后结果如下:此外,.incbin"TEST.BIN"指令要注意放在启动文件的位置,若放的不对可能会导致程序不运行,可按照下图位置放:若要将文件放在......
  • 每次插入iPhone后“照片”程序会自动打开,如何设置取消自动播放?
    每次插入iPhone后“照片”程序会自动打开,如何设置取消自动播放?引言每次当插入iPhone数据线后,“照片”程序会被自动打开,这对一部分场景是有用的,减少了那么几次的点击操作,但很多时候,用户并不一定插入手机就是为了打开“照片”应用,还要耐心等待“照片”应用加载iPhone中的照片或视......
  • Excel 生成 MS SQL 插入脚本
    背景:有1份Excel表内有一字段是中英文混合(前部分中文+后部分英文),现需要拆分中文和英文,并按记录条数插入到数据库中。关键功能点:1、一个字符串拆分为中文和英文。2、去除字符串前后空格。3、去除换行符。4、生成MSSQLINSERT脚本。Excel的每行数据对应一条插入脚本。方案一:1、......
  • 随机数生成与排序
    随机数生成是计算机领域当中十分常见的功能,下面展示随机数生成的方法以及生成之后对随机数进行排序,这里使用的是快速排序,快速排序不懂的同学,可以参考我的另外一博客链接,这里不做讲解:https://www.cnblogs.com/caizhou520/p/14542847.html随机数生成以及快速排序的代码如下所示:......
  • 深度学习设置随机数种子
    seed=2023torch.manual_seed(seed)#torch的CPU随机性,为CPU设置随机种子torch.cuda.manual_seed(seed)#torch的GPU随机性,为当前GPU设置随机种子torch.cuda.manual_seed_all(seed)#torch的GPU随机性,为所有GPU设置随机种子......
  • markdown上传csdn调整插入图片大小及位置
    @目录前言1csdn插入图片1.1<img不显示图片?不能使用?2csdn带尺寸的图片3csdn移动图片位置并且带尺寸前言关于markdown上传csdn无法显示本地图片的问题请看我的另一篇文章【2023最新教程】解决markdown上传csdn无法显示本地图片的问题本文章讲叙了自己在markdown上传cs......
  • 希尔排序:优化插入排序的精妙算法
    排序算法在计算机科学中扮演着重要的角色,其中希尔排序(ShellSort)是一种经典的排序算法。本文将带您深入了解希尔排序,包括其工作原理、性能分析以及如何使用Java进行实现。什么是希尔排序?希尔排序,又称“缩小增量排序”,是插入排序的一种改进版本。它的核心思想是通过逐步缩小增量值......
  • 新手如何用Airtest实现在图片范围内随机点击?
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途1.前言前几天有个新手同学在Airtest官群里问了这样一个问题:我是新手,在图片范围内随机点击,用Airtest怎么实现?代码?那我们就以这个问题为例,浅浅聊一下,怎么把需......
  • 10.18(随机出题Web页面)
    今天完成了javaweb的出题系统,比较简陋jsp<%@pagecontentType="text/html;charset=UTF-8"language="java"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>添加信息</title>&l......
  • 如何将一个元素插入到数组的特定索引位置?
    内容来自DOChttps://q.houxu6.top/?s=如何将一个元素插入到数组的特定索引位置?我正在寻找一个JavaScript数组插入方法,类似于:arr.insert(index,item)最好是在jQuery中,但任何JavaScript实现都可以。你想要在原生数组对象上使用splice函数。arr.splice(index,0,item......