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 thekey
already exists in the map, update the correspondingvalue
.int get(int key)
returns thevalue
to which the specifiedkey
is mapped, or-1
if this map contains no mapping for thekey
.void remove(key)
removes thekey
and its correspondingvalue
if the map contains the mapping for thekey
.
Example 1:
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]]
Constraints:
0 <= key, value <= 106
- At most
104
calls will be made toput
,get
, andremove
.
Companies:
Amazon, Microsoft, LinkedIn, Salesforce, Oracle, Apple, ServiceNow, Goldman Sachs, Walmart Global Tech, Bloomberg
Related Topics:
Array, Hash Table, Linked List, Design, Hash Function
Similar Questions:
// OJ: https://leetcode.com/problems/design-hashmap/
// Author: github.com/lzl124631x
// Time: O(1)
// Space: O(1)
class MyHashMap {
const static int N = 1000001;
int m[N];
public:
MyHashMap() {
for (int i = 0; i < N; ++i) m[i] = -1;
}
void put(int key, int value) {
m[key] = value;
}
int get(int key) {
return m[key];
}
void remove(int key) {
m[key] = -1;
}
};
// OJ: https://leetcode.com/problems/design-hashmap/
// Author: github.com/lzl124631x
// Time:
// MyHashMap: O(1)
// put, get, remove: O(logN) on average, O(N) in the worst case.
// Space: O(N)
const int keyRange = 769;
class Bucket {
list<pair<int, int>> items;
list<pair<int, int>>::iterator find(int key) {
auto it = begin(items);
while (it != end(items) && it->first != key) ++it;
return it;
}
public:
Bucket() {}
void put(int key, int val) {
auto it = find(key);
if (it == end(items)) items.emplace_front(key, val);
else it->second = val;
}
int get(int key) {
auto it = find(key);
return it != end(items) ? it->second : -1;
}
void remove(int key) {
auto it = find(key);
if (it != end(items)) items.erase(it);
}
};
class MyHashMap {
Bucket buckets[keyRange] = {};
int hash(int key) { return key % keyRange; };
public:
MyHashMap() {
}
void put(int key, int value) {
buckets[hash(key)].put(key, value);
}
int get(int key) {
return buckets[hash(key)].get(key);
}
void remove(int key) {
buckets[hash(key)].remove(key);
}
};
// OJ: https://leetcode.com/problems/design-hashmap
// Author: github.com/lzl124631x
// Time:
// MyHashMap: O(1)
// put, get, remove: O(logN) on average, O(N) in the worst case.
// Space: O(N)
const int keyRange = 769;
struct BSTreeNode {
int key, val;
BSTreeNode *left = nullptr, *right = nullptr;
BSTreeNode(int key, int val) : key(key), val(val) {}
};
class BSTree {
BSTreeNode *root = nullptr;
BSTreeNode* deleteNode(BSTreeNode* root, int key) {
if (!root) return nullptr;
if (root->key < key) {
root->right = deleteNode(root->right, key);
return root;
} else if (root->key > key) {
root->left = deleteNode(root->left, key);
return root;
}
if (!root->left || !root->right) return root->left ? root->left : root->right;
auto newRoot = root->right, left = newRoot->left, node = root->left;
newRoot->left = root->left;
while (node->right) node = node->right;
node->right = left;
return newRoot;
}
public:
BSTree() {}
void put(int key, int val) {
if (!root) {
root = new BSTreeNode(key, val);
return;
}
BSTreeNode *prev = nullptr, *n = root;
while (n) {
prev = n;
if (key == n->key) {
n->val = val;
return;
} else if (key < n->key) n = n->left;
else n = n->right;
}
if (key < prev->key) prev->left = new BSTreeNode(key, val);
else prev->right = new BSTreeNode(key, val);
}
int get(int key) {
auto n = root;
while (n) {
if (key == n->key) return n->val;
if (key < n->key) n = n->left;
else n = n->right;
}
return -1;
}
void remove(int key) {
root = deleteNode(root, key);
}
};
class MyHashMap {
BSTree buckets[keyRange] = {};
int hash(int key) { return key % keyRange; };
public:
MyHashMap() {
}
void put(int key, int value) {
buckets[hash(key)].put(key, value);
}
int get(int key) {
return buckets[hash(key)].get(key);
}
void remove(int key) {
buckets[hash(key)].remove(key);
}
};