LeetCode 面试经典150题 [12/150 O(1) 时间插入、删除和获取随机元素]


avatar
GuoYulong 2024-06-19 147

题目描述

实现RandomizedSet 类:

  • RandomizedSet() 初始化 RandomizedSet 对象
  • bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false
  • bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false
  • int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。

你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1)

示例:

输入
["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
[[], [1], [2], [2], [], [1], [2], []]
输出
[null, true, false, true, 2, true, false, 2]

解释
RandomizedSet randomizedSet = new RandomizedSet();
randomizedSet.insert(1); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。
randomizedSet.remove(2); // 返回 false ,表示集合中不存在 2 。
randomizedSet.insert(2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。
randomizedSet.getRandom(); // getRandom 应随机返回 1 或 2 。
randomizedSet.remove(1); // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。
randomizedSet.insert(2); // 2 已在集合中,所以返回 false 。
randomizedSet.getRandom(); // 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。

个人C++解答

由于对vector和map的使用还不是额别熟练,出了很多错,之后会总结一篇有关vector和map的基本操作的易出错区的文章

class RandomizedSet {
public:
    RandomizedSet() {}

    bool insert(int val) {
        if (map.find(val) != map.end())
            return false;
        values.push_back(val);
        map.insert(pair<int, int>(val, (int)values.size() - 1));
        return true;
    }

    bool remove(int val) {
        if (map.find(val) == map.end())
            return false;
        int last_index = values.back();
        int index = map[val];
        values[index] = last_index;
        map[last_index] = index;
        values.pop_back();
        map.erase(val);
        return true;
    }

    int getRandom() {
        int random = std::rand() % (values.size());
        return values[random];
    }

private:
    std::vector<int> values;
    std::unordered_map<int, int> map;
};

代码存在问题:

RandomizedSet() {
    srand((unsigned)time(NULL));
}

构造函数时应对调用srand初始化随机种子

相关阅读

注意!!!

新增会员中心页面,方便管理个人账户,充值功能暂不开启,请勿为本网站进行任何充值活动!!!

通知!!!

① 过年好!!!拖更几个月了已经,年后继续更新!!