Leetcode380插入删除获取随机元素(双map解法)

双map解法,不要自己去实现哈希表,改结构,哈希表是等概率分布,是大样本的情况下,小样本可不一定满足,你不能保证每个位置都有元素,如果重新随机,那么时间复杂度是不是就不是o1了呢,所以用java自带的map即可

class RandomizedSet {

    /** Initialize your data structure here. */
    int size;
    HashMap<Integer,Integer> keyisbiao,keyisvalue;
    public RandomizedSet() {
        size=0;
        keyisbiao=new HashMap();
        keyisvalue=new HashMap();
    }
    
    /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
    public boolean insert(int val) {
        if(!keyisvalue.containsKey(val)){
            keyisvalue.put(val,size);
            keyisbiao.put(size++,val);
            return true;
        }
        return false;
    }
    
    /** Removes a value from the set. Returns true if the set contained the specified element. */
    public boolean remove(int val) {
        if(keyisvalue.containsKey(val)){
            //其实就是保留两个删除两个,保留的分别是删除的num和最后num对应的value,删除的是num对应的value和最后的num
            //所以只要找出value对应的num和最后num对应的元素,进行put,然后删除val和最后的num(这俩都是已知的)
            int lastvalue=keyisbiao.get(--size);
            int xiaobiao=keyisvalue.get(val);//保留的下标
            keyisvalue.put(lastvalue,xiaobiao);
            keyisbiao.put(xiaobiao,lastvalue);
            keyisvalue.remove(val);
            keyisbiao.remove(size);
            return true;
        }
        return false;
    }
    
    /** Get a random element from the set. */
    public int getRandom() {
        //生成随机数,Math.random生成0-1的随机数,乘以size,随机生成0-size-1之间的整数
        int index=(int)(Math.random()*size);
        return keyisbiao.get(index);
    }
}

/**
 * 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();
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值