LeetCode 每日一题 2020-10-31 ( O(1) 时间插入、删除和获取随机元素 - 允许重复 )

设计一个数据结构,能够在平均时间复杂度 O(1) 下执行插入、删除和随机获取元素操作。问题要求支持元素的重复,并且在删除时保持 O(1) 的时间复杂度。解决方案采用了哈希表和向量的组合,哈希表用于标记元素存在和位置,向量用于存储元素。在删除操作中,通过更新哈希表和向量的对应关系,实现了在 O(1) 时间内完成删除。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值