Design a data structure that supports all following operations in 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.
算法:使用set和vector搭配。set作为主存器可以去重,vector作为随机数据发生器可以使用随机下标。
class RandomizedSet {
public:
#define random(x) (rand()%x)
set<int> docker;
vector<int> nums;
vector<int>::iterator lt;
/** Initialize your data structure here. */
RandomizedSet() {
docker.clear();
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
bool insert(int val) {
if(docker.count(val))
return false;
else{
docker.insert(val);
nums.push_back(val);
return true;
}
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
bool remove(int val) {
if(docker.count(val)) {
docker.erase(val);
lt = std::find(nums.begin(),nums.end(),val);
nums.erase(lt);
return true;
}
else
return false;
}
/** Get a random element from the set. */
int getRandom() {
srand((unsigned int)time(0));
int site = random(nums.size());
return nums[site];
}
};