706. Design HashMap
Description
Design a HashMap without using any built-in hash table libraries.
To be specific, your design should include these functions:
put(key, value): Insert a (key, value) pair into the HashMap. If the value already exists in the HashMap, update the value.get(key): Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key.remove(key): Remove the mapping for the value key if this map contains the mapping for the key.
Constraints
All keys and values will be in the range of
[0, 1000000].The number of operations will be in the range of
[1, 10000].Please do not use the built-in HashMap library.
Approach
Links
GeeksforGeeks
ProgramCreek
YouTube
Examples
MyHashMap hashMap = new MyHashMap();
hashMap.put(1, 1);
hashMap.put(2, 2);
hashMap.get(1); // returns 1
hashMap.get(3); // returns -1 (not found)
hashMap.put(2, 1); // update the existing value
hashMap.get(2); // returns 1
hashMap.remove(2); // remove the mapping for 2
hashMap.get(2); // returns -1 (not found)
Solutions
/**
* Time complexity :
* Space complexity :
*/
class MyHashMap {
private final Integer[] map;
/** Initialize your data structure here. */
public MyHashMap() {
map = new Integer[1000000];
}
/** value will always be non-negative. */
public void put(int key, int value) {
map[key] = value;
}
/** Returns the value to which the specified key is mapped, or -1 if
this map contains no mapping for the key */
public int get(int key) {
Integer value = map[key];
return value == null? -1: value;
}
/** Removes the mapping of the specified value key if this map
contains a mapping for the key */
public void remove(int key) {
map[key] = null;
}
}
/**
* Your MyHashMap object will be instantiated and called as such:
* MyHashMap obj = new MyHashMap();
* obj.put(key,value);
* int param_2 = obj.get(key);
* obj.remove(key);
*//**
* Time complexity : For each of the methods, the time complexity is O(N/K)
* where N is the number of all possible keys and K is the number of
* predefined buckets in the hashmap, which is 2069 in our case.
* Space complexity : O(K+M) where K is the number of predefined buckets
* in the hashmap and M is the number of unique keys that have been
* inserted into the hashmap.
*/
class KVBlock {
int key;
int value;
public KVBlock(int key, int value) {
this.key = key;
this.value = value;
}
}
class KVChain {
private int modKey;
private List<KVBlock> kvChain;
public KVChain(int modKey) {
this.modKey = modKey;
kvChain = new ArrayList<KVBlock>();
}
public int getValue(int key) {
for(KVBlock kvBlock: kvChain) {
if(kvBlock.key == key) {
return kvBlock.value;
}
}
return -1;
}
public void addValue(int key, int value) {
for(KVBlock kvBlock: kvChain) {
if(kvBlock.key == key) {
kvBlock.value = value;
return;
}
}
kvChain.add(new KVBlock(key, value));
}
public void removeKey(int key) {
for(int i = 0; i < kvChain.size(); i++) {
if(kvChain.get(i).key == key) {
kvChain.remove(i);
return;
}
}
}
}
class MyHashMap {
private KVChain[] map;
private int modKey = 2069;
/** Initialize your data structure here. */
public MyHashMap() {
map = new KVChain[modKey];
}
/** value will always be non-negative. */
public void put(int key, int value) {
int index = key % modKey;
if(map[index] == null) {
map[index] = new KVChain(modKey);
}
map[index].addValue(key, value);
}
/** Returns the value to which the specified key is mapped, or -1 if
this map contains no mapping for the key */
public int get(int key) {
int index = key % modKey;
if(map[index] == null) {
return -1;
}
return map[index].getValue(key);
}
/** Removes the mapping of the specified value key if this map contains
a mapping for the key */
public void remove(int key) {
int index = key % modKey;
if(map[index] == null) {
return;
}
map[index].removeKey(key);
}
}
/**
* Your MyHashMap object will be instantiated and called as such:
* MyHashMap obj = new MyHashMap();
* obj.put(key,value);
* int param_2 = obj.get(key);
* obj.remove(key);
*/Follow up
Last updated
Was this helpful?