首页 > 其他分享 >【删除交换】【哈希表】LeetCode 380. O(1) 时间插入、删除和获取随机元素

【删除交换】【哈希表】LeetCode 380. O(1) 时间插入、删除和获取随机元素

时间:2023-01-07 11:35:50浏览次数:57  
标签:loc 删除 val nums index 380 idx 哈希

题目链接

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

思路

下面引用宫水三叶大佬的题解

  • insert 操作:使用哈希表判断 val 是否存在,存在的话返回 false,否则将其添加到 nums,更新 idx,同时更新哈希表;

  • remove 操作:使用哈希表判断 val 是否存在,不存在的话返回 false,否则从哈希表中将 val 删除,同时取出其所在 nums 的下标 loc,然后将 nums[idx] 赋值到 loc 位置,并更新 idx(含义为将原本处于 loc 位置的元素删除),同时更新原本位于 idx 位置的数在哈希表中的值为 loc(若 loc 与 idx 相等,说明删除的是最后一个元素,这一步可跳过);

  • getRandom 操作:由于我们人为确保了 [0, idx] 均为存活值,因此直接在 [0,idx+1) 范围内进行随机即可。

代码

class RandomizedSet{
    static int[] nums = new int[200010];
    Random random = new Random();
    Map<Integer, Integer> map = new HashMap<>();
    int index = -1;

    public boolean insert(int val){
        if(map.containsKey(val)){
            return false;
        }

        nums[++index] = val;
        map.put(val, index);

        return true;
    }

    public boolean remove(int val){
        if(!map.containsKey(val)){
            return false;
        }

        int loc = map.remove(val);
        if(loc != index){
            map.put(nums[index], loc);
        }
        nums[loc] = nums[index--];

        return true;
    }

    public int getRandom(){
        return nums[random.nextInt(index + 1)];
    }
}

标签:loc,删除,val,nums,index,380,idx,哈希
From: https://www.cnblogs.com/shixuanliu/p/17032305.html

相关文章

  • vim删除行首数字
    简介: :1,$s/^[0-9]\{1,\}//g:%s/^[0-9]\{1,\}//g:18,200s/^/#/g:19,28s/^#//g:1,$s/^[0-9]\{1,\}//g:%s/^[0-9]\{1,\}//g:18,200s/^/#/g:19,28s/^#//g......
  • 内网渗透-PTH&PTK&PTT哈希票据传递
    1.PTH(passthehash) 1)利用lm或ntlm的值进行的渗透测试2)PTH在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过LMHash和NTLMHash访问远程......
  • 27、商品服务--三级分类--删除效果细化
    1、希望删除后有一个消息提示使用Elementui的控件2、希望删除子菜单后,父菜单仍然是展开的状态通过Elementui的树形控件的属性来进行控制......
  • K8S如何强制删除namespace
    我们有时候会遇到namespace无法删除的情况是因为 finalizers属性的原因1.将cert-mamaner导出为json文件kubectlgetnscert-manager-ojson>cert.json2.编辑cert.js......
  • 26、商品服务--三级分类--逻辑删除
    使用postman进行测试使用mybatisplus提供的逻辑删除功能https://baomidou.com/pages/6b03c5/#%E6%AD%A5%E9%AA%A4-2-%E5%AE%9E%E4%BD%93%E7%B1%BB%E5%AD%97%E6%AE%B5%E4%......
  • LeetCode 删除数组中重复项 26 80
    26(80)给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次(使得出现次数超过两次的元素只出现两次),返回删除后数组的新长度。元素的相对顺......
  • MySQL表不能修改、删除等操作,卡死、锁死情况的处理办法。
    MySQL如果频繁的修改一个表的数据,那么这么表会被锁死。造成假死现象。比如用Navicat等连接工具操作,Navicat会直接未响应,只能强制关闭软件,但是重启后依然无效。解决办法:/......
  • Linux - Linux 删除文件 空间未释放
       答案原文:Linux系统删除文件后空间并没有释放原因及解决方法https://www.cnblogs.com/shttke/p/16754312.html二、原因分析未释放磁盘空间的原因:在Linux或者Un......
  • 【哈希表】LeetCode 1. 两数之和
    题目链接1.两数之和思路使用HashMap来存储每个元素的下标及其所需要加和的数,遍历数组,检查每个数是否在HashMap中有对应的加和数,如果没有则把该数也加入HashMap中......
  • 执行mySQL的DELETE语句 进行批量删除
    执行mySQL的DELETE语句进行批量删除mysql客户端执行语句:deletefromtb_acs_planwhereIDin(12,9)andACSPIDnotin(selectdistinct(ACSPID)fromtb_acs_basic......