leetcode:O(1)时间插入、删除和获取随机元素

在这里插入图片描述
在这里插入图片描述
牵扯到随机性那就得数组了
建立一个动态数组
插入插到末尾
删除的话,交换到末尾删除
比如下图,你要删除元素7
先获取7元素的索引,为3
然后将末尾元素索引改为3
交换两元素
删除
这题需要哈希表配合数组一起来
在这里插入图片描述

class RandomizedSet {
public:
    // 存储元素的值
    vector<int> nums;
    // 记录每个元素对应在 nums 中的索引
    unordered_map<int,int> valToIndex;
    bool insert(int val) {
    // 若 val 已存在,不⽤再插⼊
    if (valToIndex.count(val)) {
        return false;
    }
    // 若 val 不存在,插⼊到 nums 尾部,
    // 并记录 val 对应的索引值
    valToIndex[val] = nums.size();
    nums.push_back(val);
    return true;
}
bool remove(int val) {
    // 若 val 不存在,不⽤再删除
    if (!valToIndex.count(val)) {
        return false;
    }
    // 先拿到 val 的索引
    int index = valToIndex[val];
    // 将最后⼀个元素对应的索引修改为 index
    valToIndex[nums.back()] = index;
    // 交换 val 和最后⼀个元素
    swap(nums[index], nums.back());
    // 在数组中删除元素 val
    nums.pop_back();
    // 删除元素 val 对应的索引
    valToIndex.erase(val);
    return true;
}
int getRandom() {
    // 随机获取 nums 中的⼀个元素
    return nums[rand() % nums.size()];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值