插入Delete GetRandom O(1)-C ++中允许重复
假设我们要创建一个支持某些操作的数据结构,这些操作必须在O(1)的时间内执行。所以让这些操作像-
insert(x):将x插入集合
remove(x):从集合中删除x
getRandom():这将找到该集合的随机元素形式。
为了解决这个问题,我们将遵循以下步骤-
制作一个数组
制作一张映射
定义一个函数insert(),将需要val,
ret:=当val不在m中时
在m[val]的末尾插入nums的大小
在数字末尾插入{val,m[val]–1}的大小对
返回ret
定义一个函数remove(),将需要val,
ret:=当val不在m中时
如果ret不为零,则-
从m删除val
last=nums的最后一个元素
m[last键][last值]:=m[val]的最后一个元素
nums[[m[val]]的最后一个元素:=最后一个
从m[val]删除最后一个元素
如果m[val]为空,则-
从num中删除最后一个元素
返回ret
定义功能getRandom()
从集合中返回一个随机元素
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>
using namespace std;
class RandomizedCollection {
public:
vector <pair <int, int>> nums;
unordered_map <int, vector<int>> m;
RandomizedCollection() {
}
bool insert(int val) {
bool ret = m.find(val) == m.end();
m[val].push_back(nums.size());
nums.push_back({val, m[val].size() - 1});
return ret;
}
bool remove(int val) {
bool ret = m.find(val) != m.end();
if(ret){
pair <int, int> last = nums.back();
m[last.first][last.second] = m[val].back();
nums[m[val].back()] = last;
m[val].pop_back();
if(m[val].empty())m.erase(val);
nums.pop_back();
}
return ret;
}
int getRandom() {
return nums[rand() % nums.size()].first;
}
};
main(){
RandomizedCollection ob;
ob.insert(10);
ob.insert(35);
ob.insert(20);
ob.insert(40);
cout << (ob.getRandom()) << endl;
ob.remove(20);
cout << (ob.getRandom()) << endl;
}输入值
Insert 10, 35, 20, 40, then get one random number, say 40, then remove 20, again get random element, that is say 35.
输出结果
40 35
热门推荐
10 儿子立冬祝福语简短独特
11 对当兵的祝福语简短
12 侄儿高考试祝福语简短
13 伴郎红包祝福语朋友简短
14 媳妇生日简短祝福语朋友
15 公司年会祝福语简短最好
16 元旦感恩祝福语简短大全
17 红包祝福语简短10字
18 周六早晨祝福语简短