<div>
Design a HashMap without using any built-in hash table libraries.
Implement the MyHashMap class:
MyHashMap()initializes the object with an empty map.void put(int key, int value)inserts a(key, value)pair into the HashMap. If thekeyalready exists in the map, update the correspondingvalue.int get(int key)returns thevalueto which the specifiedkeyis mapped, or-1if this map contains no mapping for thekey.void remove(key)removes thekeyand its correspondingvalueif the map contains the mapping for thekey.
Example 1:
<pre>Input ["MyHashMap", "put", "put", "get", "get", "put", "get", "remove", "get"] [[], [1, 1], [2, 2], [1], [3], [2, 1], [2], [2], [2]] Output [null, null, null, 1, -1, null, 1, null, -1]
Explanation MyHashMap myHashMap = new MyHashMap(); myHashMap.put(1, 1); // The map is now [[1,1]] myHashMap.put(2, 2); // The map is now [[1,1], [2,2]] myHashMap.get(1); // return 1, The map is now [[1,1], [2,2]] myHashMap.get(3); // return -1 (i.e., not found), The map is now [[1,1], [2,2]] myHashMap.put(2, 1); // The map is now [[1,1], [2,1]] (i.e., update the existing value) myHashMap.get(2); // return 1, The map is now [[1,1], [2,1]] myHashMap.remove(2); // remove the mapping for 2, The map is now [[1,1]] myHashMap.get(2); // return -1 (i.e., not found), The map is now [[1,1]] </pre>
Constraints:
0 <= key, value <= 10<sup>6</sup>- At most
10<sup>4</sup>calls will be made toput,get, andremove.
</div>
题目大意:
设计HashMap
LL解题思路(推荐):
大学学到的方法,用Array实现,将key mod prime num找到index插入。难点在于冲突处理,这里用chaining方法,也就是LL
解题步骤:
N/A
注意事项:
- 迭代LL时候,每种方法put, get, remove都不同。put只能迭代到最后一个不能到None,因为要从尾部加入。 get正常一个个迭代。remove要从parent也就是it.next迭代因为要删除节点。
Python代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44class MyHashMap(TestCases):
def __init__(self):
self.key_space = 997
self.buckets = [ListNode(-1, -1) for _ in range(self.key_space)]
def put(self, key: int, value: int) -> None:
index = key % self.key_space
it = self.buckets[index]
while it:
if it.key == key:
it.val = value
return
if not it.next:
break
it = it.next
it.next = ListNode(key, value)
def get(self, key: int) -> int:
index = key % self.key_space
it = self.buckets[index]
while it:
if it.key == key:
return it.val
it = it.next
return -1
def remove(self, key: int) -> None:
index = key % self.key_space
it = self.buckets[index]
while it.next:
if it.next.key == key:
tmp = it.next
it.next, tmp.next = it.next.next, None
return
it = it.next
class ListNode:
def __init__(self, key, val):
self.key = key
self.val = val
self.next = None
算法分析:
时间复杂度为O(k),空间复杂度O(n), k为冲突数
数组算法II解题思路:
较容易实现,remove复杂度稍差,但是最差情况也是同上
Python代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27class MyHashMap(TestCases):
def __init__(self):
self.key_space = 997
self.buckets = [[] for _ in range(self.key_space)]
def put(self, key: int, value: int) -> None:
index = key % self.key_space
for i, [_key, _val] in enumerate(self.buckets[index]):
if _key == key:
self.buckets[index][i] = [key, value]
return
self.buckets[index].append([key, value])
def get(self, key: int) -> int:
index = key % self.key_space
for _key, _val in self.buckets[index]:
if _key == key:
return _val
return -1
def remove(self, key: int) -> None:
index = key % self.key_space
for i, [_key, _val] in enumerate(self.buckets[index]):
if _key == key:
self.buckets[index].pop(i)
return
算法分析:
时间复杂度为O(k),空间复杂度O(n), k为冲突数


