实现 RandomizedSet
类:
RandomizedSet()
初始化RandomizedSet
对象bool insert(int val)
当元素val
不存在时,向集合中插入该项,并返回true
;否则,返回false
。bool remove(int val)
当元素val
存在时,从集合中移除该项,并返回true
;否则,返回false
。int getRandom()
随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1)
。
示例:
输入 ["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"] [[], [1], [2], [2], [], [1], [2], [) 输出 [null, true, false, true, 2, true, false, 2]
解释 RandomizedSet randomizedSet = new RandomizedSet (); randomizedSet.insert (1); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。 randomizedSet.remove (2); // 返回 false ,表示集合中不存在 2 。 randomizedSet.insert (2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。 randomizedSet.getRandom (); //getRandom 应随机返回 1 或 2 。 randomizedSet.remove (1); // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。 randomizedSet.insert (2); // 2 已在集合中,所以返回 false 。 randomizedSet.getRandom (); // 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。
答案 用一个数组和一个 map 实现
变长数组只操作最后一个值实现 o1 删除操作的重点在于将变长数组的最后一个元素移动到待删除元素的下标处,然后删除变长数组的最后一个元素。该操作的时间复杂度是 O (1),且可以保证在删除操作之后变长数组中的所有元素的下标都连续,方便插入操作和获取随机元素操作。
var RandomizedSet = function () {
this.nums = []
this.indices = new Map()
};
/**
* @param {number} val
* @return {boolean}
*/
RandomizedSet.prototype.insert = function (val) {
if (this.indices.has(val)) {
return false
}
let index = this.nums.length
this.nums.push(val)
this.indices.set(val, index)
return true
};
/**
* @param {number} val
* @return {boolean}
*/
RandomizedSet.prototype.remove = function (val) {
if (!this.indices.has(val)) {
return false
}
let id = this.indices.get(val)
this.nums[id] = this.nums[this.nums.length - 1]
this.indices.set(this.nums[id], id)
this.nums.pop()
this.indices.delete(val)
return true
};
/**
* @return {number}
*/
RandomizedSet.prototype.getRandom = function () {
const randomIndex = Math.floor(Math.random() * this.nums.length)
return this.nums[randomIndex]
};
/**
* Your RandomizedSet object will be instantiated and called as such:
* var obj = new RandomizedSet()
* var param_1 = obj.insert(val)
* var param_2 = obj.remove(val)
* var param_3 = obj.getRandom()
*/
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51