380. Insert Delete GetRandom O(1)
Problem description:
Design a data structure that supports all following operations in average O(1) time.
insert(val): Inserts an item val to the set if not already present.
remove(val): Removes an item val from the set if present.
getRandom: Returns a random element from current set of elements. Each element must have the same probability of being returned.
Example:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// Init an empty set.
RandomizedSet randomSet = new RandomizedSet();
// Inserts 1 to the set. Returns true as 1 was inserted successfully.
randomSet.insert(1);
// Returns false as 2 does not exist in the set.
randomSet.remove(2);
// Inserts 2 to the set, returns true. Set now contains [1,2].
randomSet.insert(2);
// getRandom should return either 1 or 2 randomly.
randomSet.getRandom();
// Removes 1 from the set, returns true. Set now contains [2].
randomSet.remove(1);
// 2 was already in the set, so return false.
randomSet.insert(2);
// Since 2 is the only number in the set, getRandom always return 2.
randomSet.getRandom();
Solution:
In this question, we need to randomly pick a element from the inserted numbers. To do so, we need to know two things:
- The numbers we currently have
- Where are they(index)
We use a dictionary to store the value-index
mapping, an array to store all the numbers.
Also, the question mentioned want to make each operation O(1)
. We have two choice to delete the element in array:
array.remove(val)
: takesO(n)
time- move the element to last index then
array.pop()
:O(1)
1 | class RandomizedSet: |
1 | class RandomizedSet { |
time complexity: $O(1)$
space complexity: $O(n)$
reference: