380. Insert Delete GetRandom O(1)
来源:互联网 发布:沈航网络自助 编辑:程序博客网 时间:2024/06/05 06:06
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.
Example:
// 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();
刚开始想的是用set,但用到getRandom()时,会用到循环,时间不是O(n)
class RandomizedSet { set<int> nums;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(nums.find(val)!=nums.end()) return 0; nums.insert(val); return 1; } /** Removes a value from the set. Returns true if the set contained the specified element. */ bool remove(int val) { if(nums.find(val)==nums.end())return 0; nums.erase(val); return 1; } /** Get a random element from the set. */ int getRandom() { int rnd=rand()%nums.size(),i=0; set<int>::iterator it; for( it=nums.begin();i!=rnd;it++,i++);//这里用循环了,会慢 return *it; }};转载别人的:点击打开链接
用一个hash表记录每个元素的值在vector中的位置,当要删除一个元素时,先找到该元素的位置,将其更新为末尾元素,vector末尾弹出,同时更新hash表。
class RandomizedSet { //set<int> nums; vector<int> nums; map<int ,int> locs;//vals to keypublic: /** 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.find(val)!=nums.end()) return 0; nums.insert(val); return 1;*/ if(locs.count(val)!=0) return 0; nums.push_back(val); locs[val]=(nums.size()-1); return 1; } /** Removes a value from the set. Returns true if the set contained the specified element. */ bool remove(int val) { /* if(nums.find(val)==nums.end())return 0; nums.erase(val); return 1;*/ if(locs.count(val)==0) return 0; int last=nums[nums.size()-1]; int loc=locs[val]; nums[loc]=last;//更新nums locs[last]=loc;//更新locs locs.erase(val); nums.pop_back(); return 1; } /** Get a random element from the set. */ int getRandom() { /* int rnd=rand()%nums.size(),i=0; set<int>::iterator it; for( it=nums.begin();i!=rnd;it++,i++); return *it;*/ return nums[rand()%nums.size()]; }};
0 0
- [leetcode] 380. Insert Delete GetRandom O(1)
- leetcode 380.Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- [LeetCode]380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 【Leetcode】380. Insert Delete GetRandom O(1)
- LeetCode 380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- 【leetcode】380. Insert Delete GetRandom O(1)
- Android listView 的使用
- map与set的基本应用
- HDU 1109 Run Away 模拟退火算法
- mysql int,datetime,timestamp时间戳、时间日期相关总结分析
- Spring MVC学习
- 380. Insert Delete GetRandom O(1)
- FEA大数据实践之亿级数据量处理
- 1078. Hashing (25)
- 数据库
- if __name__ == '__main__' 如何正确理解?
- 测试系统是大段还是小端存储的c代码
- Effective C++ 条款08:别让异常逃离析构函数
- Javascript中document.execCommand()的用法
- runtime心得