插入、删除和随机访问都是 O(1) 的容器——leetcode30

插入、删除和随机访问都是 O(1) 的容器

描述

设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构:
insert(val):当元素 val 不存在时返回 true ,并向集合中插入该项,否则返回 false 。
remove(val):当元素 val 存在时返回 true ,并从集合中移除该项,否则返回 false 。
getRandom:随机返回现有集合中的一项。每个元素应该有 相同的概率 被返回。

示例

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

题解:List + HashMap

数据结构:

  • LinkedList: 保存数,插入数据和根据下标删除数据的时间复杂度为O(1)

  • HashMap: (num: index), 保存数的下标

实现逻辑:

  • add:list.add(num), map检验元素是否存在

  • remove:用最后一个元素覆盖被删除的元素

image-20220526143903767

class RandomizedSet {
   private List<Integer> nums;
   private Map<Integer, Integer> map;  //val: index

    public RandomizedSet() {
       nums = new LinkedList<>();
       map = new HashMap<>();
    }

    public boolean insert(int val) {
        if(map.containsKey(val)) return false;

        nums.add(val);
        map.put(val, nums.size() -1);
        return true;
    }

    public boolean remove(int val) {
        if(!map.containsKey(val)) return false;

        int index = map.get(val);
        if(index != nums.size() -1) {
            int last = nums.get(nums.size()-1);
            nums.set(index, last);
            map.put(last, index);
        }
        map.remove(val);
        nums.remove(nums.size()-1);

        return true;
    }

    public int getRandom() {
        int index = (int) (Math.random() * nums.size());

        return nums.get(index);
    }
}
posted @ 2022-05-26 14:43  言思宁  阅读(90)  评论(0编辑  收藏  举报