- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了这个leetcode问题Insert Delete GetRandom,要求它实现一个数据结构以在平均O(1)时间内支持Insert,Delete和getRandom,并将其解决为使用map和vector的情况。
我的解决方案通过了除最后一个测试用例之外的所有测试用例,我不知道为什么?最后一个测试用例确实非常大,无法调试。
我稍稍更改了代码,然后通过了,但是仍然不知道为什么上一个未通过。
Not Acceptable 解决方案:
class RandomizedSet {
map<int, int> mp;
vector<int> v;
public:
/** 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(mp.find(val) == mp.end()){
v.push_back(val);
mp[val] = v.size()-1;
return true;
}
else return false;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
bool remove(int val) {
if(mp.find(val) == mp.end()){
return false;
}
else{
int idx = mp[val];
mp.erase(val);
swap(v[idx], v[v.size()-1]);
v.pop_back();
if(mp.size()!=0) mp[v[idx]] = idx;
return true;
}
}
/** Get a random element from the set. */
int getRandom() {
if(v.size() == 0) return 0;
int rndm = rand()%v.size();
return v[rndm];
}
};
/**
* 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();
*/
if(mp.find(val) == mp.end()){
return false;
}
else{
int idx = mp[val];
swap(v[idx], v[v.size()-1]);
v.pop_back();
mp[v[idx]] = idx;
mp.erase(val);
return true;
}
mp.erase(val)
放在最后,并将
if(mp.size()!=0) mp[v[idx]] = idx
替换为
mp[v[idx]] = idx
仅。
最佳答案
这是因为当删除的元素是最后一个元素时行为未定义。
例如说操作是
insert(1) // v = [1], mp = [1->0]
insert(2) // v = [1,2], mp = [1->0, 2->1]
remove(2):
int idx = mp[val]; // val = 2, idx = 1
mp.erase(val); // mp = [1->0]
swap(v[idx], v[v.size()-1]); // idx = v.size()-1 = 1, so this does nothing.
v.pop_back(); // v = [1]
if(mp.size()!=0) mp[v[idx]] = idx; // mp[v[1]] = 1.
// But v[1] is undefined after pop_back(), since v's size is 1 at this point.
关于c++ - LeetCode 380:插入删除GetRandom O(1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62356815/
这是一道面试题:使用get、put 和getRandom 实现一个Set 类。 我会考虑以下选项: 排序/未排序链表:get - O(N),put - O(N),getRandom - O(N) 未排
这个问题在这里已经有了答案: getrandom syscall in C not found (5 个答案) 关闭 5 年前。 愚蠢的问题,我可能缺少标题,但手册页说我只需要 #include
我有一个 getRandom 方法,它从数组中获取一个随机整数并返回它,但是不知何故,当我尝试在我的驱动程序中调用该方法时,出现错误 “europeanroulette 类型中的方法 getRando
我有如下一段代码 #include #include #include unsigned long int s; syscall(SYS_getrandom, &s, sizeof(unsign
问题已通过升级 C 库解决。 我想使用系统调用 getrandom ( http://man7.org/linux/man-pages/man2/getrandom.2.html ) gcc-5 -s
我构建了一个 scrapy 蜘蛛(scrapy 1.4)。这个蜘蛛是通过 django-rq 和 supervisord 从 django 网站按需触发的。 这是监听 django-rq 事件的 su
请引用os和secrets的文档: os.getrandom(大小,标志= 0) Get up to size random bytes. The function can return less b
我正在尝试在 GCE Ubuntu 14.04 VM 上构建 Python 3.5.1,当在解压缩的文件夹中运行 ./configure 时,我得到: checking for the Linux g
使用 python 安装最新的 alpine ( 3.8 ) 后,出现以下错误 $ docker run -it alpine:3.8 sh / # sed -i -e 's/v[[:digit:]]
我是一名优秀的程序员,十分优秀!