时间轴

2025-10-04

init


题目:

这题我本来以为 getRandom 只要概率相同即可,但是这个题检测时大概率设置了随机数种子,如果不是调用 rand()得出来的顺序必定和答案不同。
这题主要用 hashmap 存储 val,index,用 vector 做随机访问插入时直接放入 vector 的最后一位,删除时将被删除的元素与最后一个元素交换位置,然后弹出最后一个元素 pop_back(),要记得更改 hashmap 中因为交换而使得最后一个元素的 Index。

1
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
#include <algorithm>
#include <unordered_map>
#include <vector>

using std::unordered_map;
using std::vector;

class RandomizedSet {
private:
unordered_map<int, int> umap;
vector<int> vec;

public:
RandomizedSet() {}

bool insert(int val) {

if (umap.count(val) == 0) {
vec.push_back(val);
umap[val] = vec.size() - 1;
return true;
} else {
return false;
}
}

bool remove(int val) {
if (umap.count(val) == 0) {
return false;
} else {
umap[vec.back()] = umap[val];
std::swap(vec[umap[val]], vec.back());

vec.pop_back();
umap.erase(val);

return true;
}
}

int getRandom() { return vec[std::rand() % vec.size()]; }
};