381. O(1) 时间插入、删除和获取随机元素 - 允许重复
随机提取set第一个字符 这个以后需要多考虑一下
class RandomizedCollection {
public:
vector<int> nums;
unordered_map<int,unordered_set<int>> mp;
RandomizedCollection() {
}
bool insert(int val) {
if(mp.count(val))
{
mp[val].insert(nums.size());
nums.push_back(val);
return false;
}else{
unordered_set<int> temp;
mp[val] = temp;
mp[val].insert(nums.size());
nums.push_back(val);
return true;
}
}
bool remove(int val) {
if(mp.count(val) )
{
int rmidx = *(mp[val].begin());
int bkidx = nums.size()-1;
int bkVal = nums.back();
if(val != bkVal)
{
mp[bkVal].erase(bkidx);
mp[bkVal].insert(rmidx);
mp[val].erase(rmidx);
swap(nums[bkidx],nums[rmidx]);
}else{
mp[val].erase(bkidx);
}
nums.pop_back();
if(mp[val].empty())
{
mp.erase(val);
}
return true;
}
else{
return false;
}
}
int getRandom() {
int n = nums.size();
int idx = rand() % n;
return nums[idx];
}
};