--- title: '380. Insert Delete GetRandom O(1)' description: 'Implement the RandomizedSet class:' icon: dot topics: - { name: "Array", slug: "array" } - { name: "Hash Table", slug: "hash-table" } - { name: "Math", slug: "math" } - { name: "Design", slug: "design" } - { name: "Randomized", slug: "randomized" } issue: "https://github.com/prdlk/leetcode/issues/90" sidebar: label: 'Insert Delete GetRandom O(1)' badge: 'Medium' --- ::::warning You must implement the functions of the class such that each function works in average O(1) time complexity. :::: ### Example 1: - Input: `` - Output: `` - Explanation: 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`. ### Constraints: - `-2^31 <= val <= 2^31 - 1` - At most 2 * 10^5 calls will be made to insert, remove, and getRandom. - There will be at least one element in the data structure when getRandom is called. ## Solution ```py from random import choice class RandomizedSet: def __init__(self): self.list = [] self.dict = {} def insert(self, val: int) -> bool: if val in self.dict: return False self.dict[val] = len(self.list) self.list.append(val) return True def remove(self, val: int) -> bool: if val in self.dict: last, idx = self.list[-1], self.dict[val] self.list[idx], self.dict[last] = last, idx self.list.pop() del self.dict[val] return True return False def getRandom(self) -> int: return choice(self.list) # Your RandomizedSet object will be instantiated and called as such: # obj = RandomizedSet() # param_1 = obj.insert(val) # param_2 = obj.remove(val) # param_3 = obj.getRandom() ```