380. O(1) 时间插入、删除和获取随机元素
2024-09-28 16:52:30

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

思路

哈希表可以完成$O(1)$的插入和删除,但是无法用下标获得元素。考虑到变长数组可以在$O(1)$的时间完成获取元素,我们只需要再维护一个变长数组即可。用哈希表维护元素即它们在变长数组的位置。在添加元素时,把元素添加到变长数组的末端;在删除元素时,更新数组末端元素在哈下表的位置,用末端元素替换数组被删除元素。

复杂度

  • 时间复杂度: $O(1)$,哈希表插入删除时间都是$O(1)$,删除数组最后一个元素也是$O(1)$。
  • 空间复杂度: $O(n)$,哈希表和数组。

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

class RandomizedSet {
    private Map<Integer, Integer> s;
    private List<Integer> a;
    private int count;
    private Random random;
   
    public RandomizedSet() {
        s = new HashMap<>();
        a = new ArrayList<>();
        random = new Random();
        count = 0;
    }

    public boolean insert(int val) {
        if (s.containsKey(val)) return false;
        s.put(val, count);
      a.add(val);
        count++;
        return true;
    }

    public boolean remove(int val) {
        if (!s.containsKey(val)) return false;
        count--;
        s.put(a.get(count), s.get(val));
        a.set(s.get(val), a.get(count));
        a.remove(count);
        s.remove(val);
        return true;
    }

    public int getRandom() {
        return a.get(random.nextInt(count));
    }
}