229 字
1 分钟
LeetCode 面试经典150题 [12/150 O(1) 时间插入、删除和获取随机元素]
题目描述
实现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 。个人C++解答
由于对vector和map的使用还不是额别熟练,出了很多错,之后会总结一篇有关vector和map的基本操作的易出错区的文章
class RandomizedSet {public: RandomizedSet() {}
bool insert(int val) { if (map.find(val) != map.end()) return false; values.push_back(val); map.insert(pair<int, int>(val, (int)values.size() - 1)); return true; }
bool remove(int val) { if (map.find(val) == map.end()) return false; int last_index = values.back(); int index = map[val]; values[index] = last_index; map[last_index] = index; values.pop_back(); map.erase(val); return true; }
int getRandom() { int random = std::rand() % (values.size()); return values[random]; }
private: std::vector<int> values; std::unordered_map<int, int> map;};代码存在问题:
RandomizedSet() { srand((unsigned)time(NULL));}构造函数时应对调用srand初始化随机种子
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
LeetCode 面试经典150题 [12/150 O(1) 时间插入、删除和获取随机元素]
https://ericonline.cn/posts/leetcode-面试经典150题-12-150-o1-时间插入删除和获取随机元素/ 部分信息可能已经过时
相关文章 智能推荐