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()]; }};
新闻热点
疑难解答