美文网首页
常数时间插入删除获取元素

常数时间插入删除获取元素

作者: 小幸运Q | 来源:发表于2021-04-19 20:10 被阅读0次

image.png

删除的时候,交换最后一个元素与被删除元素,然后pop最后一个元素。记录交换元素的新位置,写入hashmap。

插入查询map发现存在则不插入,如果不存在则push_back。

删除查询map发现不存在则不删除,如果存在则与最后一位元素交换然后pop。

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()];
    }
};

相关文章

网友评论

      本文标题:常数时间插入删除获取元素

      本文链接:https://www.haomeiwen.com/subject/drhilltx.html