设计一个支持在平均 时间复杂度 O(1) , 执行以下操作的数据结构。

注意: 允许出现重复元素。

  1. insert(val):向集合中插入元素 val。
  2. remove(val):当 val 存在时,从集合中移除一个 val。
  3. 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)时间插入、删除和获取随机元素-允许重复相关推荐

  1. 381. O(1) 时间插入、删除和获取随机元素 - 允许重复

    链接:381. O(1) 时间插入.删除和获取随机元素 - 允许重复 题解: class RandomizedCollection { private:std::unordered_map<in ...

  2. 力扣 O(1) 时间插入、删除和获取随机元素 - 允许重复

    力扣 O(1) 时间插入.删除和获取随机元素 - 允许重复 题目描述 设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构. 注意: 允许出现重复元素. insert(val):向集 ...

  3. LeetCode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复(vector + 哈希)

    文章目录 1. 题目 2. 解题 1. 题目 设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构. 注意: 允许出现重复元素. insert(val):向集合中插入元素 val. ...

  4. leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复

    设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构. 注意: 允许出现重复元素. insert(val):向集合中插入元素 val. remove(val):当 val 存在时,从 ...

  5. Leetcode每日一题:381.insert-delete-getrandom-o1-duplicates-allowed(时间插入、删除和获取随机元素-允许重复)

    思路:这个题标签标的困难,但实际上没什么难度:随机和插入就用一个vector即可,随机生成len以内的数字temp,然后取出v[temp]就能达到要求:关键是remove这个操作,开始我用的常规遍历删 ...

  6. 常数时间插入、删除和获取随机元素

    常数时间插入.删除和获取随机元素 设计一个支持在平均时间复杂度O(1)下,执行以下操作的数据结构. insert(val): 当元素val不存在时,向集合中插入该项. remove(val): 元素v ...

  7. 算法刷题-O(1) 时间插入、删除和获取随机元素、汇总区间

    文章目录 O(1) 时间插入.删除和获取随机元素 汇总区间 改写字符串 O(1) 时间插入.删除和获取随机元素 设计一个支持在_平均 _时间复杂度 **O(1) 下, **执行以下操作的数据结构. 注 ...

  8. 2022-1-28 Leetcode 380.O(1)时间插入、删除和获取随机元素

    删除和插入的时间为 O(1)O(1)O(1)是哈希之类的,而O(1)O(1)O(1)的随机获取可以用数组实现. 所以比较好的方式是,使用数组实现数据的存储,使用哈希表存放数组的下标,每次删除的时候将数 ...

  9. LeetCode 380. 常数时间插入、删除和获取随机元素(哈希+vector)

    1. 题目 设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构. insert(val):当元素 val 不存在时,向集合中插入该项. remove(val):元素 val 存在时, ...

  10. LeetCode每日一题——380. O(1) 时间插入、删除和获取随机元素

    目录 题目要求 示例 思路 题解 题目要求 实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象 bool insert(int val) 当 ...

最新文章

  1. git 配置多个SSH-Key
  2. python聚类分析如何确定分类个数_Python数据挖掘—聚类—KMeans划分法
  3. 【Blog.Core开源】快速升级.NET 6.0
  4. python小城市创业好项目_小城市创业好项目有哪些?
  5. Updatexml函数再mysql中的作用
  6. 百度在美国遭集体起诉;iPhone 11 成苹果最畅销机型;OpenSSL 曝高危漏洞 | 极客头条...
  7. 约瑟夫环问题(动态链表操作)n个学生围成一圈,每m个出队,输出所有出队的序列
  8. axios post,get,put
  9. 入侵本地Mac OS X方针与技巧
  10. android multimedia框架总结,Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程...
  11. C++ primer 5th 读完的一点心得体会
  12. R语言的点图dot plot
  13. 按键精灵X学习笔记(二):键盘命令
  14. 想要提高自己的写作水平?吃透这篇文章就够了
  15. AD ADSI入门
  16. 四种不同单源最短路径算法性能比较
  17. 常用快递电子面单接口API对接方法
  18. 国产NS32F103CBT6软硬件通用STM32F103CBT6
  19. 直播行业遭到DDoS攻击该如何预防?
  20. 计算机毕业设计之java+springboot基于vue的生鲜交易系统-生鲜商城网站

热门文章

  1. 当出现“在当前位置发现已经存在为RESUME.XLW的文件。您希望将该文件替换掉吗?” 解决方案...
  2. presentModalViewController和dismissModalViewControllerAnimated的使用总结
  3. java web 学习计划
  4. Salesforce:下个财年营收我们有望突破100亿美元
  5. 挨踢部落故事汇(2):机缘所致转型之路
  6. Phonegap(Cordova)3.4 + Android 环境搭建
  7. 为多个VLAN实现DCHP
  8. python序列类型唯一的映射类型_什么是python中唯一的映射类型
  9. 关于cad2010的激活
  10. python大列表_Python列表操作大全(非常全)