LeetCode 面试经典150题 380.O(1)时间插入、删除和获取随机元素

题目:

实现RandomizedSet 类:

  • RandomizedSet() 初始化 RandomizedSet 对象
  • bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
  • bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
  • int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。

你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。

思路:

代码:

class RandomizedSet {
    static int[] nums = new int[200010];  // 最多调用插入2*10^5次,创建一个足够大的数组
    Random random = new Random();
    Map<Integer, Integer> map = new HashMap<>();
    int idx = -1;

    public RandomizedSet() {

    }
    
    public boolean insert(int val) {
        if (map.containsKey(val)) 
            return false;
        nums[++idx] = val;
        map.put(val, idx);
        return true;
    }
    
    public boolean remove(int val) {
        if (!map.containsKey(val)) 
            return false;
        int loc = map.remove(val); // 根据key删除kv对,返回v值
        // loc位置删除,仍需保证[0,idx]元素存活,把最后(idx)位置元素放在loc位置,idx--
        if (loc != idx) 
            map.put(nums[idx], loc);
        nums[loc] = nums[idx--];
        return true;
    }
    
    public int getRandom() {
        return nums[random.nextInt(idx + 1)];  // 随机返回[0, idx + 1)
    }
}

性能:时间复杂度O(1)   空间复杂度O(n)   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值