InsertDeleteGetRandomO1
Problem
Solution
By default, we can insert and getRandom elements from an array in \(O(1)\)
time. To remove an element from an array in \(O(1)\) time, it needs to be
at the end of the array. We can move val to the end. To do this in
\(O(1)\) time, we need to find the index of val in the array in
\(O(1)\) time. We can use a dictionary to store the indices of each element
in the array.
Code
import random
class RandomizedSet:
"""A data structure that supports ``insert``, ``remove``, and ``getRandom``
in O(1) time.
"""
def __init__(self):
self.indices = {}
self.arr = []
def insert(self, val: int) -> bool:
"""Inserts ``val`` into the set. Returns ``True`` if ``val`` was not
present and ``False`` otherwise.
"""
if val in self.indices:
return False
else:
self.arr.append(val)
self.indices[val] = len(self.arr) - 1
return True
def remove(self, val: int) -> bool:
"""Removes ``val`` from the set. Returns ``True`` if ``val`` was
present and ``False`` otherwise.
"""
if val not in self.indices:
return False
else:
i = self.indices[val]
self.indices[self.arr[-1]] = i
self.arr[i] = self.arr[-1]
del self.indices[val]
self.arr.pop()
return True
def getRandom(self) -> int:
"""Returns a random element from the set.
"""
return random.choice(self.arr)
Test
>>> from InsertDeleteGetRandomO1 import RandomizedSet
>>> random_set = RandomizedSet()
>>> random_set.insert(1)
True
>>> random_set.remove(2)
False
>>> random_set.getRandom()
1
>>> random_set.insert(2)
True
>>> random_set.remove(1)
True
>>> random_set.insert(2)
False
>>> random_set.getRandom()
2
- class InsertDeleteGetRandomO1.RandomizedSet
Bases:
objectA data structure that supports
insert,remove, andgetRandomin O(1) time.- getRandom() int
Returns a random element from the set.
- insert(val: int) bool
Inserts
valinto the set. ReturnsTrueifvalwas not present andFalseotherwise.
- remove(val: int) bool
Removes
valfrom the set. ReturnsTrueifvalwas present andFalseotherwise.