381. O(1) 时间插入、删除和获取随机元素 - 允许重复
难度困难
设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构。
注意: 允许出现重复元素。
insert(val):向集合中插入元素 val。
remove(val):当 val 存在时,从集合中移除一个 val。
getRandom:从现有集合中随机获取一个元素。每个元素被返回的概率应该与其在集合中的数量呈线性相关。
考虑到时间复杂度要求为O(1),选择使用 哈希表 来标记是否存在字符, 向量 实现数据的存储
// 最原始版本:删除时不满足O(1) 的时间复杂度
// 数据部分定义
unordered_map<int,int> M;
vector<int> data;
// 插入函数: 直接插入结果
bool insert(int val) {
data.push_back(val);
if(M[val]++) return false;
return true;
}
// 删除部分 时间复杂度为O(n) 此处不满足
bool remove(int val) {
if(M[val]){
for(vector<int>::iterator index=data.begin();inde