题目:
这题我本来以为 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()]; } };
|