LeetCode-706
Design HashMap : Design a HashMap without using any built-in hash table libraries.
note : At most 104 calls will be made to put, get, and remove.
Answer
:::python
class ListNode: def init(self, key=None, value=None): self.key = key self.value = value self.next = Noneclass MyHashMap: def init(self): self.size = 10**4 self.table = collections.defaultdict(ListNode) def put(self, key: int, value: int) -> None: index = key % self.size if self.table[index].value is None: self.table[index] = ListNode(key, value) return p = self.table[index] while p: if p.key == key : p.value = value return if p.next is None: break p = p.next p.next = ListNode(key, value) def get(self, key: int) -> int: index = key % self.size if self.table[index].value is None: return -1 p = self.table[index] while p: if p.key == key: return p.value p = p.next return -1 def remove(self, key: int) -> None: index = key % self.size if self.table[index].value is None: return p = self.table[index] if p.key == key: self.table[index] = ListNode() if p.next is None else p.next return prev = p while p: if p.key == key: prev.next = p.next return prev, p = p, p.next# Your MyHashMap object will be instantiated and called as such:# obj = MyHashMap()# obj.put(key,value)# param_2 = obj.get(key)# obj.remove(key)
Result : 234ms Memory: 20.6mb
λ¬Έμ μ€λͺ
ν΄μ맡(HashMap)μ ꡬννλ λ¬Έμ μ λλ€. ν΄μ맡μ put, get, remove λ©μλλ₯Ό ꡬνν΄μΌ ν©λλ€.
ν΄μ맡μ ν€(Key)μ κ°(Value)μ μ μ₯νλ μλ£κ΅¬μ‘°μ λλ€. ν€λ μ€λ³΅λμ§ μμΌλ©°, κ°μ μ€λ³΅λ μ μμ΅λλ€. put λ©μλλ ν€μ κ°μ μ μ₯νλ λ©μλμ λλ€. get λ©μλλ ν€μ ν΄λΉνλ κ°μ λ°ννλ λ©μλμ λλ€. λ§μ½ ν΄λΉνλ κ°μ μ°Ύμ μ μμΌλ©΄ -1μ λ°νν©λλ€. remove λ©μλλ ν€μ ν΄λΉνλ κ°μ μ κ±°νλ λ©μλμ λλ€.
κ°κ°μ λ©μλλ§λ€ μκ° λ³΅μ‘λλ O(1) μ΄νμ΄μ΄μΌ ν©λλ€.
ν΄κ²° λ°©λ²
ν΄μ맡μ ꡬννλ κ°μ₯ κ°λ¨ν λ°©λ²μ ν΄μ ν μ΄λΈ(Hash Table)μ μ΄μ©νλ κ²μ λλ€. 보ν΅μ λ°°μ΄κ³Ό μ°κ²° 리μ€νΈλ‘ ꡬνλ©λλ€. λ°°μ΄μ ν΅ν΄ ν€λ₯Ό ν΄μκ°μΌλ‘ λ°κΎΈμ΄ μΈλ±μ€λ‘ μ¬μ©νκ³ , μ°κ²° 리μ€νΈλ₯Ό μ¬μ©νμ¬ κ°λ€μ μ μ₯ν©λλ€.
put λ©μλλ ν€λ₯Ό ν΄μκ°μΌλ‘ λ°κΎΈμ΄ μΈλ±μ€λ₯Ό ꡬνκ³ , ν΄λΉ μΈλ±μ€μ μ°κ²° 리μ€νΈμμ ν€λ₯Ό μ°Ύμ κ°μ μ μ₯νκ±°λ, μ°κ²° 리μ€νΈκ° λΉμ΄μμ κ²½μ° μλ‘μ΄ λ Έλλ₯Ό μΆκ°ν©λλ€.
get λ©μλλ ν€λ₯Ό ν΄μκ°μΌλ‘ λ°κΎΈμ΄ μΈλ±μ€λ₯Ό ꡬνκ³ , ν΄λΉ μΈλ±μ€μ μ°κ²° 리μ€νΈμμ ν€λ₯Ό μ°Ύμ κ°μ λ°νν©λλ€. λ§μ½ ν΄λΉνλ κ°μ΄ μμΌλ©΄ -1μ λ°νν©λλ€.
remove λ©μλλ ν€λ₯Ό ν΄μκ°μΌλ‘ λ°κΎΈμ΄ μΈλ±μ€λ₯Ό ꡬνκ³ , ν΄λΉ μΈλ±μ€μ μ°κ²° 리μ€νΈμμ ν€λ₯Ό μ°Ύμ λ Έλλ₯Ό μ κ±°ν©λλ€.
ν΄μ맡μ μ¬μ©νλ ν΄μν¨μλ ν΄μκ°μ΄ μΆ©λν κ°λ₯μ±μ΄ μκΈ° λλ¬Έμ μ€λ³΅λλ ν΄μκ°μ μ²λ¦¬ν μ μλ λ°©λ²μ΄ νμν©λλ€. μ΄ λ¬Έμ μμλ chaining λ°©μμ μ¬μ©νμ¬ μ°κ²° 리μ€νΈλ₯Ό μ¬μ©νλ κ²μΌλ‘ μΆ©λμ μ²λ¦¬ν©λλ€.
μ¬μ©μ μ½λ
μ¬μ©μ μ½λλ μ μμ μΌλ‘ λμν©λλ€. μ μ ν μλ£κ΅¬μ‘°μ λ©μλλ₯Ό μ΄μ©νμ¬ κ°κ°μ λ©μλλ§λ€ O(1) μ΄νμ μκ° λ³΅μ‘λλ₯Ό κ°μ§λλ‘ κ΅¬νλμ΄ μμ΅λλ€. μ¬μ©μ μ½λλ κ°μ ν μ¬μ§κ° μμ§λ§, μ 곡λ 쑰건μμλ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ μ½λμ λλ€.
λ°λΌμ, μ¬μ©μ μ½λμ λν νκ°λ μ μμ μΌλ‘ λμνλ€κ³ ν μ μμ΅λλ€.
'π’ One step' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[leetcode-217] Contains Duplicate (0) | 2023.05.11 |
---|---|
How to LeetCode effectively (0) | 2023.05.10 |
[leetcode-38] Count and Say (0) | 2023.05.05 |
[leetcode-48] Rotate Image (0) | 2023.04.30 |
[leetcode-347] Top K Frequent Elements (0) | 2023.04.27 |
LeetCode-706
Design HashMap : Design a HashMap without using any built-in hash table libraries.
note : At most 104 calls will be made to put, get, and remove.
Answer
:::python
class ListNode: def init(self, key=None, value=None): self.key = key self.value = value self.next = Noneclass MyHashMap: def init(self): self.size = 10**4 self.table = collections.defaultdict(ListNode) def put(self, key: int, value: int) -> None: index = key % self.size if self.table[index].value is None: self.table[index] = ListNode(key, value) return p = self.table[index] while p: if p.key == key : p.value = value return if p.next is None: break p = p.next p.next = ListNode(key, value) def get(self, key: int) -> int: index = key % self.size if self.table[index].value is None: return -1 p = self.table[index] while p: if p.key == key: return p.value p = p.next return -1 def remove(self, key: int) -> None: index = key % self.size if self.table[index].value is None: return p = self.table[index] if p.key == key: self.table[index] = ListNode() if p.next is None else p.next return prev = p while p: if p.key == key: prev.next = p.next return prev, p = p, p.next# Your MyHashMap object will be instantiated and called as such:# obj = MyHashMap()# obj.put(key,value)# param_2 = obj.get(key)# obj.remove(key)
Result : 234ms Memory: 20.6mb
λ¬Έμ μ€λͺ
ν΄μ맡(HashMap)μ ꡬννλ λ¬Έμ μ λλ€. ν΄μ맡μ put, get, remove λ©μλλ₯Ό ꡬνν΄μΌ ν©λλ€.
ν΄μ맡μ ν€(Key)μ κ°(Value)μ μ μ₯νλ μλ£κ΅¬μ‘°μ λλ€. ν€λ μ€λ³΅λμ§ μμΌλ©°, κ°μ μ€λ³΅λ μ μμ΅λλ€. put λ©μλλ ν€μ κ°μ μ μ₯νλ λ©μλμ λλ€. get λ©μλλ ν€μ ν΄λΉνλ κ°μ λ°ννλ λ©μλμ λλ€. λ§μ½ ν΄λΉνλ κ°μ μ°Ύμ μ μμΌλ©΄ -1μ λ°νν©λλ€. remove λ©μλλ ν€μ ν΄λΉνλ κ°μ μ κ±°νλ λ©μλμ λλ€.
κ°κ°μ λ©μλλ§λ€ μκ° λ³΅μ‘λλ O(1) μ΄νμ΄μ΄μΌ ν©λλ€.
ν΄κ²° λ°©λ²
ν΄μ맡μ ꡬννλ κ°μ₯ κ°λ¨ν λ°©λ²μ ν΄μ ν μ΄λΈ(Hash Table)μ μ΄μ©νλ κ²μ λλ€. 보ν΅μ λ°°μ΄κ³Ό μ°κ²° 리μ€νΈλ‘ ꡬνλ©λλ€. λ°°μ΄μ ν΅ν΄ ν€λ₯Ό ν΄μκ°μΌλ‘ λ°κΎΈμ΄ μΈλ±μ€λ‘ μ¬μ©νκ³ , μ°κ²° 리μ€νΈλ₯Ό μ¬μ©νμ¬ κ°λ€μ μ μ₯ν©λλ€.
put λ©μλλ ν€λ₯Ό ν΄μκ°μΌλ‘ λ°κΎΈμ΄ μΈλ±μ€λ₯Ό ꡬνκ³ , ν΄λΉ μΈλ±μ€μ μ°κ²° 리μ€νΈμμ ν€λ₯Ό μ°Ύμ κ°μ μ μ₯νκ±°λ, μ°κ²° 리μ€νΈκ° λΉμ΄μμ κ²½μ° μλ‘μ΄ λ Έλλ₯Ό μΆκ°ν©λλ€.
get λ©μλλ ν€λ₯Ό ν΄μκ°μΌλ‘ λ°κΎΈμ΄ μΈλ±μ€λ₯Ό ꡬνκ³ , ν΄λΉ μΈλ±μ€μ μ°κ²° 리μ€νΈμμ ν€λ₯Ό μ°Ύμ κ°μ λ°νν©λλ€. λ§μ½ ν΄λΉνλ κ°μ΄ μμΌλ©΄ -1μ λ°νν©λλ€.
remove λ©μλλ ν€λ₯Ό ν΄μκ°μΌλ‘ λ°κΎΈμ΄ μΈλ±μ€λ₯Ό ꡬνκ³ , ν΄λΉ μΈλ±μ€μ μ°κ²° 리μ€νΈμμ ν€λ₯Ό μ°Ύμ λ Έλλ₯Ό μ κ±°ν©λλ€.
ν΄μ맡μ μ¬μ©νλ ν΄μν¨μλ ν΄μκ°μ΄ μΆ©λν κ°λ₯μ±μ΄ μκΈ° λλ¬Έμ μ€λ³΅λλ ν΄μκ°μ μ²λ¦¬ν μ μλ λ°©λ²μ΄ νμν©λλ€. μ΄ λ¬Έμ μμλ chaining λ°©μμ μ¬μ©νμ¬ μ°κ²° 리μ€νΈλ₯Ό μ¬μ©νλ κ²μΌλ‘ μΆ©λμ μ²λ¦¬ν©λλ€.
μ¬μ©μ μ½λ
μ¬μ©μ μ½λλ μ μμ μΌλ‘ λμν©λλ€. μ μ ν μλ£κ΅¬μ‘°μ λ©μλλ₯Ό μ΄μ©νμ¬ κ°κ°μ λ©μλλ§λ€ O(1) μ΄νμ μκ° λ³΅μ‘λλ₯Ό κ°μ§λλ‘ κ΅¬νλμ΄ μμ΅λλ€. μ¬μ©μ μ½λλ κ°μ ν μ¬μ§κ° μμ§λ§, μ 곡λ 쑰건μμλ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ μ½λμ λλ€.
λ°λΌμ, μ¬μ©μ μ½λμ λν νκ°λ μ μμ μΌλ‘ λμνλ€κ³ ν μ μμ΅λλ€.
'π’ One step' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[leetcode-217] Contains Duplicate (0) | 2023.05.11 |
---|---|
How to LeetCode effectively (0) | 2023.05.10 |
[leetcode-38] Count and Say (0) | 2023.05.05 |
[leetcode-48] Rotate Image (0) | 2023.04.30 |
[leetcode-347] Top K Frequent Elements (0) | 2023.04.27 |