381.O(1)时间插入、删除和获取随机元素-允许重复
设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构。
注意: 允许出现重复元素。
insert(val)
:向集合中插入元素 val。remove(val)
:当 val 存在时,从集合中移除一个 val。getRandom
:从现有集合中随机获取一个元素。每个元素被返回的概率应该与其在集合中的数量呈线性相关。
示例:
// 初始化一个空的集合。 RandomizedCollection collection = new RandomizedCollection();// 向集合中插入 1 。返回 true 表示集合不包含 1 。 collection.insert(1);// 向集合中插入另一个 1 。返回 false 表示集合包含 1 。集合现在包含 [1,1] 。 collection.insert(1);// 向集合中插入 2 ,返回 true 。集合现在包含 [1,1,2] 。 collection.insert(2);// getRandom 应当有 2/3 的概率返回 1 ,1/3 的概率返回 2 。 collection.getRandom();// 从集合中删除 1 ,返回 true 。集合现在包含 [1,2] 。 collection.remove(1);// getRandom 应有相同概率返回 1 和 2 。 collection.getRandom();
class RandomizedCollection {
public:
/** Initialize your data structure here. */
RandomizedCollection() {
}
/** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
bool insert(int val) {
m[val].insert(nums.size());
nums.push_back(val);
return m[val].size() == 1;
}
/** Removes a value from the collection. Returns true if the collection contained the specified element. */
bool remove(int val) {
if (m[val].empty()) return false;
int idx = *m[val].begin();
m[val].erase(idx);
if (nums.size() - 1 != idx) {
int t = nums.back();
nums[idx] = t;
m[t].erase(nums.size() - 1);
m[t].insert(idx);
}
nums.pop_back();
return true;
}
/** Get a random element from the collection. */
int getRandom() {
return nums[rand() % nums.size()];
}
private:
vector<int> nums;
unordered_map<int, unordered_set<int>> m;
};
/**
* Your RandomizedCollection object will be instantiated and called as such:
* RandomizedCollection obj = new RandomizedCollection();
* bool param_1 = obj.insert(val);
* bool param_2 = obj.remove(val);
* int param_3 = obj.getRandom();
*/
381.O(1)时间插入、删除和获取随机元素-允许重复相关推荐
- 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
链接:381. O(1) 时间插入.删除和获取随机元素 - 允许重复 题解: class RandomizedCollection { private:std::unordered_map<in ...
- 力扣 O(1) 时间插入、删除和获取随机元素 - 允许重复
力扣 O(1) 时间插入.删除和获取随机元素 - 允许重复 题目描述 设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构. 注意: 允许出现重复元素. insert(val):向集 ...
- LeetCode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复(vector + 哈希)
文章目录 1. 题目 2. 解题 1. 题目 设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构. 注意: 允许出现重复元素. insert(val):向集合中插入元素 val. ...
- leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构. 注意: 允许出现重复元素. insert(val):向集合中插入元素 val. remove(val):当 val 存在时,从 ...
- Leetcode每日一题:381.insert-delete-getrandom-o1-duplicates-allowed(时间插入、删除和获取随机元素-允许重复)
思路:这个题标签标的困难,但实际上没什么难度:随机和插入就用一个vector即可,随机生成len以内的数字temp,然后取出v[temp]就能达到要求:关键是remove这个操作,开始我用的常规遍历删 ...
- 常数时间插入、删除和获取随机元素
常数时间插入.删除和获取随机元素 设计一个支持在平均时间复杂度O(1)下,执行以下操作的数据结构. insert(val): 当元素val不存在时,向集合中插入该项. remove(val): 元素v ...
- 算法刷题-O(1) 时间插入、删除和获取随机元素、汇总区间
文章目录 O(1) 时间插入.删除和获取随机元素 汇总区间 改写字符串 O(1) 时间插入.删除和获取随机元素 设计一个支持在_平均 _时间复杂度 **O(1) 下, **执行以下操作的数据结构. 注 ...
- 2022-1-28 Leetcode 380.O(1)时间插入、删除和获取随机元素
删除和插入的时间为 O(1)O(1)O(1)是哈希之类的,而O(1)O(1)O(1)的随机获取可以用数组实现. 所以比较好的方式是,使用数组实现数据的存储,使用哈希表存放数组的下标,每次删除的时候将数 ...
- LeetCode 380. 常数时间插入、删除和获取随机元素(哈希+vector)
1. 题目 设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构. insert(val):当元素 val 不存在时,向集合中插入该项. remove(val):元素 val 存在时, ...
- LeetCode每日一题——380. O(1) 时间插入、删除和获取随机元素
目录 题目要求 示例 思路 题解 题目要求 实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象 bool insert(int val) 当 ...
最新文章
- git 配置多个SSH-Key
- python聚类分析如何确定分类个数_Python数据挖掘—聚类—KMeans划分法
- 【Blog.Core开源】快速升级.NET 6.0
- python小城市创业好项目_小城市创业好项目有哪些?
- Updatexml函数再mysql中的作用
- 百度在美国遭集体起诉;iPhone 11 成苹果最畅销机型;OpenSSL 曝高危漏洞 | 极客头条...
- 约瑟夫环问题(动态链表操作)n个学生围成一圈,每m个出队,输出所有出队的序列
- axios post,get,put
- 入侵本地Mac OS X方针与技巧
- android multimedia框架总结,Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程...
- C++ primer 5th 读完的一点心得体会
- R语言的点图dot plot
- 按键精灵X学习笔记(二):键盘命令
- 想要提高自己的写作水平?吃透这篇文章就够了
- AD ADSI入门
- 四种不同单源最短路径算法性能比较
- 常用快递电子面单接口API对接方法
- 国产NS32F103CBT6软硬件通用STM32F103CBT6
- 直播行业遭到DDoS攻击该如何预防?
- 计算机毕业设计之java+springboot基于vue的生鲜交易系统-生鲜商城网站
热门文章
- 当出现“在当前位置发现已经存在为RESUME.XLW的文件。您希望将该文件替换掉吗?” 解决方案...
- presentModalViewController和dismissModalViewControllerAnimated的使用总结
- java web 学习计划
- Salesforce:下个财年营收我们有望突破100亿美元
- 挨踢部落故事汇(2):机缘所致转型之路
- Phonegap(Cordova)3.4 + Android 环境搭建
- 为多个VLAN实现DCHP
- python序列类型唯一的映射类型_什么是python中唯一的映射类型
- 关于cad2010的激活
- python大列表_Python列表操作大全(非常全)