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 key
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;*/
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()];
}
};