思路1
- 使用无序集合完成快速查找删除
- 使用rand()%hashset.size() 实现 随机获取
代码1
class RandomizedSet {
unordered_set<int> hashset;
public:
RandomizedSet() {}
bool insert(int val) {
if(hashset.count(val)==1)
return false;
hashset.insert(val);
return true;
}
bool remove(int val) {
if(hashset.count(val)==0)
return false;
hashset.erase(val);
return true;
}
int getRandom() {
int index=rand()%hashset.size();
auto i=hashset.begin();
while(index){
index--;
i++;
}
return *i;
}
};
思路2
- 无序集合不能实现下标访问元素 而向量可以实现下标访问元素
- 向量如何实现常数删除——将删除结点移到尾部使用pop_back()
代码2
class RandomizedSet {
unordered_map<int, int> hashmap;
vector<int> ans;
public:
RandomizedSet() {}
bool insert(int val) {
if (hashmap.count(val) == 1)
return false;
ans.push_back(val);
hashmap[val] = ans.size()-1;
return true;
}
bool remove(int val) {
if (hashmap.count(val) == 0)
return false;
int pos = hashmap[val];
int temp = ans[ans.size() - 1];
ans[ans.size() - 1] = ans[pos];
ans[pos] = temp;
ans.pop_back();
hashmap[temp] = pos;
hashmap.erase(val);
return true;
}
int getRandom() {
int index = rand() % hashmap.size();
return ans[index];
}
};