LeetCode 380. O(1) 时间插入、删除和获取随机元素题解

380. O(1) 时间插入、删除和获取随机元素题解

题目来源:380. O(1) 时间插入、删除和获取随机元素

2022.04.13每日一题

LeetCode 题解持续更新中GitHub仓库地址 CSDN博客地址

今天的题目就是考察数据结构的一道题目,要求所有的操作都在 O ( 1 ) O(1) O(1) 的时间复杂度下进行,那么我们首先想到的就是 HashMap来进行存储,而后我们又有随机取出一个数字的要求,那么我们可以再创建一个数组,来存储数字,从数组中随机取出一个数字,返回对应的值,那么就清楚了,使用 HashMap来存储 数组的索引和相应的值,key 为 值,val 为索引,这样 既保证了 题目中给定的 value值是唯一的,又保证能够在数组中找到对应的值的索引,也方便后续的增加、删除、以及查询

class RandomizedSet {
    // 创建 HashMap 来存储对应的 key 以及  val,保证唯一性
    unordered_map<int, int> map;
    // 创建数组用来存储 题目中 insert 中加入的数字
    int nums[200009];
    // 创建一个变量,用于记录 数组当前索引
    int size = -1;
public:
    RandomizedSet() {
        map.clear();
        size = -1;
        srand((unsigned) time(NULL));
    }

    bool insert(int val) {
        // 如果存在了相同的值就返回 false
        if (map.count(val)) return false;
        size++;
        nums[size] = val;
        // 更新 map
        map[val] = size;
        return true;
    }

    bool remove(int val) {
        // 如果 map 中不存在,就直接返回 false
        if (!map.count(val)) return false;
        // 获取 val 的 索引
        int remove = map[val];
        map.erase(val);
        // 如果 要移除的元素不是数组的末尾就将 map 更新
        if (size != remove) map[nums[size]] = remove;
        // 将 对应的值更新
        nums[remove] = nums[size];
        // 并且缩减 当前数组的长度
        size--;
        return true;
    }

    int getRandom() {
        // 从 nums 数组中 随机取出一个
        return nums[rand() % (size + 1)];
    }
};
class RandomizedSet {
    // 创建 HashMap 来存储对应的 key 以及  val,保证唯一性
    private Map<Integer, Integer> map = new HashMap<>();
    // 创建数组用来存储 题目中 insert 中加入的数字
    private int[] nums = new int[200009];
    // 创建一个变量,用于记录 数组当前索引
    private int size = -1;
    // 随机一个
    Random random = new Random();

    public RandomizedSet() {
        map.clear();
        size = -1;
    }

    public boolean insert(int val) {
        // 如果存在了相同的值就返回 false
        if (map.containsKey(val)) return false;
        size++;
        nums[size] = val;
        // 更新 map
        map.put(val, size);
        return true;
    }

    public boolean remove(int val) {
        // 如果 map 中不存在,就直接返回 false
        if (!map.containsKey(val)) return false;
        // 获取 val 的 索引
        Integer remove = map.remove(val);
        // 如果 要移除的元素不是数组的末尾就将 map 更新
        if (size != remove) map.put(nums[size], remove);
        // 将 对应的值更新
        nums[remove] = nums[size];
        // 并且缩减 当前数组的长度
        size--;
        return true;
    }

    public int getRandom() {
        // 从 nums 数组中 随机取出一个
        return nums[random.nextInt(size + 1)];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值