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

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

时间:2023-10-16 19:11:06浏览次数:35  
标签:insert 删除 val nums getRandom RandomizedSet 插入 int 随机

题目

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

提示:

  • -2^31 <= val <= 2^31 - 1
  • 最多调用 insertremovegetRandom 函数 2 * 10^5
  • 在调用 getRandom 方法时,数据结构中 至少存在一个 元素。

代码

class RandomizedSet {
    static int[] nums = new int[200010];
    Random random = new Random();
    Map<Integer, Integer> map = new HashMap<>();  //储存nums中的值和对应下标
    int idx = -1;  //nums[0~idx]有数据,其他无
    public boolean insert(int val) {
        if (map.containsKey(val)) return false;
        nums[++idx] = val;  //在尾部插入数据
        map.put(val, idx);  //将插入的数据和插入的位置记录到map中
        return true;
    }
    public boolean remove(int val) {
        if (!map.containsKey(val)) return false;
        int loc = map.remove(val);  //返回key为val的map值,即val在nums中的下标
        //如果删除的数据不是在尾部,则将尾部的数据移动到删除数据的下标处,使nums[0~idx]都是有数据的
        if (loc != idx) map.put(nums[idx], loc);
        nums[loc] = nums[idx--];
        return true;
    }
    public int getRandom() {
        return nums[random.nextInt(idx + 1)];  //随机获取nums中下标为0~idx的数据
    }
}

/**
 * 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();
 */

代码对应的解释已经写在注释中。



参考资料:https://leetcode.cn/problems/insert-delete-getrandom-o1/description/?envType=study-plan-v2&envId=top-interview-150

标签:insert,删除,val,nums,getRandom,RandomizedSet,插入,int,随机
From: https://www.cnblogs.com/Enid/p/17768151.html

相关文章

  • redux如何删除对象
    deleteItem(state,{payload}){returnproduce(state,(draftState:any)=>{const{electronicFenceKey,airportId}=payload;letres=state.detailList.filter((item)=>{return!(item.electronic......
  • 使用Aead加密支持随机读写的文件
    关联数据的认证加密Aead(authenticatedencryptionwithassociateddata),是一种同时具备保密性,完整性和可认证性的加密形式,加密过程采用数据分组形式,对同一个密钥,每次加密需要使用不重复的Nonce(NumberusedonlyOnce),加密后生成验证数据标签(Tag)用于解密时验证,并且可以附加一段......
  • 万户OA域控集成企业微信-删除离职用户
    OA与域控集成后,在域控中禁用/删除用户后,OA同步禁用,但是对接的企业微信并未删除用户。Quartz计划任务classDeleteWeiXinUserJob:IJob{publicstaticstringcorpid=ConfigurationManager.AppSettings["corpid"];publicstaticstringsecrect=Configu......
  • 删除注释
    网上找了很多删除注释的方法: \/\*[\s\S]*\*\/|\/\/.*    删除全部注释 搜索时选择正则* 上面这种方法可以删除大部分注释,但是无法删除这样多行的注释:/* border-radius: 0.3125rem;    background-color: white; */ /\*(.|\r\n|\n)*?\*/删除多......
  • JS操作增加Class属性和移除删除Class属性
    直接上代码functiongo(a){if(a=='shifu'){//移除属性varshop=document.getElementsByClassName("shop")[0];shop.classList.remove("ns-border-color");//增加属性......
  • linux文件系统:删除大文件、删除大量文件
    linux文件删除文件删除控制的变量i_link:文件的硬连接数量i_count:引用计数(每有一个程序使用i_count加1)文件删除的条件:i_link0&i_count0rm命令对于删除命令rm而言,实际就是减少磁盘引用计数i_link。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作......
  • 前端歌谣的刷题之路-第四十九题-头部插入数据
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 前端歌谣的刷题之路-第五十题-尾部插入数据
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 前端歌谣的刷题之路-第五十题-尾部插入数据
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • AutoCAD C# 程序插入OLE图片
    参考博客地址https://www.cnblogs.com/edata/p/17474704.html varfn=@"D:\NetDriveDir\OneDrive\软件工具\MNYT.png";varbm=Bitmap.FromFile(fn);Clipboard.SetImage(bm);varpt=newPoint3d(10,20,0);varcmdstrInsetOle=newList<string>(){......