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