# O(1) 时间插入、删除和获取随机元素

实现RandomizedSet 类:

你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 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 。

 

提示:

以下错误的选项是?

## aop ### before ```cpp #include using namespace std; ``` ### after ```cpp ``` ## 答案 ```cpp class RandomizedSet { unordered_map dict; vector list; public: /** Initialize your data structure here. */ RandomizedSet() { srand(time(0)); } /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ bool insert(int val) { if (dict.find(val) != dict.end()) return false; list.push_back(val); dict[val] = list.size(); return true; } /** Removes a value from the set. Returns true if the set contained the specified element. */ bool remove(int val) { if (dict.find(val) == dict.end()) return false; dict[list.back()] = dict[val]; swap(list.back(), list[dict[val]]); list.pop_back(); dict.erase(val); return true; } /** Get a random element from the set. */ int getRandom() { int pos = list.empty() ? 0 : rand() % list.size(); return list[pos]; } }; ``` ## 选项 ### A ```cpp class RandomizedSet { public: /** Initialize your data structure here. */ RandomizedSet() { } /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ bool insert(int val) { if (mMap.count(val) > 0) return false; mData.push_back(val); mMap[val] = mData.size() - 1; return true; } /** Removes a value from the set. Returns true if the set contained the specified element. */ bool remove(int val) { if (mMap.count(val) > 0) { int last_num = mData.back(); int val_index = mMap[val]; mData[val_index] = last_num; mMap[last_num] = val_index; mData.pop_back(); mMap.erase(val); return true; } return false; } /** Get a random element from the set. */ int getRandom() { int index = rand() % mData.size(); return mData[index]; } private: vector mData; unordered_map mMap; }; ``` ### B ```cpp class RandomizedSet { public: unordered_set ust; /** Initialize your data structure here. */ RandomizedSet() { } /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ bool insert(int val) { if (ust.find(val) != ust.end()) return false; ust.insert(val); return true; } /** Removes a value from the set. Returns true if the set contained the specified element. */ bool remove(int val) { if (ust.find(val) == ust.end()) return false; ust.erase(val); return true; } /** Get a random element from the set. */ int getRandom() { int ind = rand() % ust.size(); auto it = ust.begin(); for (int i = 0; i < ind; i++) { it++; } return *it; } }; ``` ### C ```cpp class RandomizedSet { public: vector nums; unordered_map nums_inds; /** Initialize your data structure here. */ RandomizedSet() { } /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ bool insert(int val) { if (nums_inds.count(val) != 0) return false; nums.push_back(val); nums_inds[val] = nums.size() - 1; return true; } /** Removes a value from the set. Returns true if the set contained the specified element. */ bool remove(int val) { if (nums_inds.count(val) == 0) return false; int last = nums.back(); int ind = nums_inds[val]; nums[ind] = last; nums_inds[last] = ind; nums.pop_back(); nums_inds.erase(val); return true; } /** Get a random element from the set. */ int getRandom() { int ind = rand() % nums.size(); return nums[ind]; } }; ```