mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-02 13:12:44 +00:00
82 lines
3.3 KiB
Plaintext
82 lines
3.3 KiB
Plaintext
---
|
|
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"
|
|
companies:
|
|
- { name: "Bloomberg", period: "Thirty Days", frequency: 69.8 }
|
|
- { name: "Amazon", period: "Thirty Days", frequency: 39.1 }
|
|
- { name: "Apple", period: "Three Months", frequency: 80.4 }
|
|
- { name: "Google", period: "Three Months", frequency: 32.7 }
|
|
- { name: "Axon", period: "Six Months", frequency: 100 }
|
|
- { name: "Okta", period: "Six Months", frequency: 100 }
|
|
- { name: "Quora", period: "Six Months", frequency: 100 }
|
|
- { name: "SoFi", period: "Six Months", frequency: 100 }
|
|
- { name: "Uber", period: "Six Months", frequency: 61.9 }
|
|
- { name: "Yandex", period: "Six Months", frequency: 59.6 }
|
|
- { name: "LinkedIn", period: "Six Months", frequency: 54.1 }
|
|
- { name: "Microsoft", period: "Six Months", frequency: 24.1 }
|
|
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()
|
|
```
|