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 = None
class 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 |