Insert Delete GetRandom O(1)问题及解法
来源:互联网 发布:mhx配装器 java怎么用 编辑:程序博客网 时间:2024/06/03 20:49
问题描述:
Design a data structure that supports all following operations in average O(1) time.
insert(val)
: Inserts an item val to the set if not already present.remove(val)
: Removes an item val from the set if present.getRandom
: Returns a random element from current set of elements. Each element must have the same probability of being returned.
示例:
// Init an empty set.RandomizedSet randomSet = new RandomizedSet();// Inserts 1 to the set. Returns true as 1 was inserted successfully.randomSet.insert(1);// Returns false as 2 does not exist in the set.randomSet.remove(2);// Inserts 2 to the set, returns true. Set now contains [1,2].randomSet.insert(2);// getRandom should return either 1 or 2 randomly.randomSet.getRandom();// Removes 1 from the set, returns true. Set now contains [2].randomSet.remove(1);// 2 was already in the set, so return false.randomSet.insert(2);// Since 2 is the only number in the set, getRandom always return 2.randomSet.getRandom();
问题分析:
利用map和vector分别保留<value,index> 和 value,这里有个小知识点,搞清楚这个,此题迎刃而解。
如何在常量时间内删除数组的一个元素?在可改变原先顺序的基础上,我们可以将要数组最后一个元素覆盖到要删除的元素的位置,调用数组pop_back方法即可。
过程详见代码:
class RandomizedSet {public: unordered_map<int, int> map;vector<int> res;/** Initialize your data structure here. */RandomizedSet() {srand(time(NULL));}/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */bool insert(int val) {if (!map.count(val)){map[val] = res.size();res.emplace_back(val);return true;}return false;}/** Removes a value from the set. Returns true if the set contained the specified element. */bool remove(int val) {if (!map.count(val)) return false;int t = res.size() - 1;map[res.back()] = map[val];res[map[val]] = res.back();res.pop_back();map.erase(val);return true;}/** Get a random element from the set. */int getRandom() {int index = rand() % map.size();return res[index];}};/** * Your RandomizedSet object will be instantiated and called as such: * RandomizedSet obj = new RandomizedSet(); * bool param_1 = obj.insert(val); * bool param_2 = obj.remove(val); * int param_3 = obj.getRandom(); */
阅读全文
0 0
- Insert Delete GetRandom O(1)问题及解法
- Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1)
- leetcode之Insert Delete GetRandom O(1) 问题
- 【leetcode】Insert Delete GetRandom O(1)
- 【Leetcode】Insert Delete GetRandom O(1)
- LeetCode[380] Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1) - Duplicates allowed
- Leetcode 之 Insert Delete GetRandom O(1)
- LeetCode:381 Insert Delete GetRandom O(1)
- leetcode之 Insert Delete GetRandom O(1)
- [leetcode] 380. Insert Delete GetRandom O(1)
- 150. Insert Delete GetRandom O(1)
- leetcode 380.Insert Delete GetRandom O(1)
- 个人整理的Linux命令
- Opencv入门(播放AVI视频)
- 机器学习:逻辑回归与Python代码实现
- Maven 项目中无法修改Dynamic Web Module无法修改的解决办法
- PHP Redis 缓存实例
- Insert Delete GetRandom O(1)问题及解法
- c#调用winapi为外部程序控件赋值
- Html页面内容的执行顺序
- 在执行目录下找文件
- logback系统异常日志写入文件
- 【美团外卖】广告算法 高级研发工程师/技术专家
- eclipse 项目中嵌入jetty
- SSH 访问内网
- LeetCode-Best Time to Buy and Sell Stock