Date and Time: Sep 12, 2024, 23:23 (EST)
Link: https://leetcode.com/problems/insert-delete-getrandom-o1/
Implement the RandomizedSet
class:
-
RandomizedSet()
Initializes theRandomizedSet
object. -
bool insert(int val)
Inserts an itemval
into the set if not present. Returnstrue
if the item was not present,false
otherwise. -
bool remove(int val)
Removes an itemval
from the set if present. Returnstrue
if the item was present,false
otherwise. -
int getRandom()
Returns a random element from the current set of elements (it's guaranteed that at least one element exists when this method is called). Each element must have the same probability of being returned.
You must implement the functions of the class such that each function works in average
Example 1:
Input:
["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
[[], [1], [2], [2], [], [1], [2], []]
Output:
[null, true, false, true, 2, true, false, 2]
Explanation:
RandomizedSet randomizedSet = new RandomizedSet();
randomizedSet.insert(1); // Inserts 1 to the set. Returns true as 1 was inserted successfully.
randomizedSet.remove(2); // Returns false as 2 does not exist in the set.
randomizedSet.insert(2); // Inserts 2 to the set, returns true. Set now contains [1,2].
randomizedSet.getRandom(); // getRandom() should return either 1 or 2 randomly.
randomizedSet.remove(1); // Removes 1 from the set, returns true. Set now contains [2].
randomizedSet.insert(2); // 2 was already in the set, so return false.
randomizedSet.getRandom(); // Since 2 is the only number in the set, getRandom() will always return 2.
-
-2^31 <= val <= 2^31 - 1
-
At most
2 * 10^5
calls will be made toinsert
,remove
, andgetRandom
. -
There will be at least one element in the data structure when
getRandom
is called.
In order to insert and remove in hashmap{}
and list[]
to keep track.
Insert: We insert val in self.hashmap{}
with the current length of list[]
. Then, we append val
into list[]
.
Remove: We want to switch the value we need to remove with the last value in self.list
, we first get the index by self.hashmap[val]
, then we access the value's index and replace it with the last value by self.list[idx] = lastVal
. Then, we remove the last value in list[]
and update the hashmap's last value to idx
. Finally, we can remove val
from self.hashmap{}
.
getRandom: we can use built-in random.choice(self.list)
to return element from self.list
.
class RandomizedSet:
def __init__(self):
self.hashmap = {}
self.list = []
def insert(self, val: int) -> bool:
if val not in self.hashmap:
self.hashmap[val] = len(self.list)
self.list.append(val)
return True
return False
def remove(self, val: int) -> bool:
# Swap the position of last val in self.list and current val's position in self.list, then remove it from the end
if val in self.hashmap:
lastIdx = self.hashmap[self.list[-1]]
lastVal = self.list[-1]
curIdx = self.hashmap[val]
# Swap two vals in list
self.list[lastIdx], self.list[curIdx] = self.list[curIdx], self.list[lastIdx]
# Update lastVal in hashmap with curIdx
self.hashmap[lastVal] = curIdx
del self.hashmap[val]
self.list.pop() # Remove the last val (currVal)
return True
else:
return False
def getRandom(self) -> int:
return random.choice(self.list)
Time Complexity:
Space Complexity: n
is all integers that will be added.