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.
class RandomizedSet {
private:
vector<int> nums;
unordered_map<int, int> m;
public:
RandomizedSet() {
// do initialize if necessary
}
// Inserts a value to the set
// Returns true if the set did not already contain the specified element or false
bool insert(int val) {
// Write your code here
if (m.count(val))
return false;
nums.push_back(val);
m[val] = nums.size()-1;
return true;
}
// Removes a value from the set
// Return true if the set contained the specified element or false
bool remove(int val) {
// Write your code here
if (!m.count(val))
return false;
m[nums[nums.size()-1]] = m[val];
nums[m[val]] = nums[nums.size()-1];
nums.pop_back();
m.erase(val);
return true;
}
// Get a random element from the set
int getRandom() {
// Write your code here
return nums[rand() % nums.size()];
}
};
/**
* Your RandomizedSet object will be instantiated and called as such:
* RandomizedSet obj = new RandomizedSet();
* bool param = obj.insert(val);
* bool param = obj.remove(val);
* int param = obj.getRandom();
*/