class RandomizedSet {
public:
unordered_map<int,int> hash;
vector<int> arr;
/** 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(hash.count(val))return 0;
hash[val]=arr.size();
arr.push_back(val);
return 1;
//使用数组来达到随机访问的目的
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
bool remove(int val) {
if(!hash.count(val))return 0;
//如果没有找到就告知错误
hash[arr.back()]=hash[val];
//由于数组尾端删除的空间复杂度为O(1),所以将要删除的元素与数组尾端的元素置换
//在哈希表中标记数组原来尾端的元素的新的位置
arr[hash[val]]=arr.back();
//在数组中将数组原来尾端的元素置换到被删除的数字的位置
hash.erase(val);
//在哈希表中删掉要删除的数字的键值对
arr.pop_back();
//在数组中删除尾端的元素
return 1;
}
/** Get a random element from the set. */
int getRandom() {
return arr[rand()%arr.size()];
}
};
/**
* Your RandomizedSet object will be instantiated and called as such:
* RandomizedSet* obj = new RandomizedSet();
* bool param_1 = obj->insert(val);
* bool param_2 = obj->remove(val);
* int param_3 = obj->getRandom();
*/
作者:zan-wu-ni-cheng
链接:https://leetcode-cn.com/problems/FortPu/solution/c-hashshu-zu-by-zan-wu-ni-cheng-t1bd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。