题目:
实现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)