705. Design HashSet
Description
Design a HashSet without using any built-in hash table libraries.
Implement MyHashSet
class:
-
void add(key)
Inserts the valuekey
into the HashSet. -
bool contains(key)
Returns whether the valuekey
exists in the HashSet or not. -
void remove(key)
Removes the valuekey
in the HashSet. Ifkey
does not exist in the HashSet, do nothing.
Example 1:
Input
["MyHashSet", "add", "add", "contains", "contains", "add", "contains", "remove", "contains"]
[[], [1], [2], [1], [3], [2], [2], [2], [2]]
Output
[null, null, null, true, false, null, true, null, false]
Explanation
MyHashSet myHashSet = new MyHashSet();
myHashSet.add(1); // set = [1]
myHashSet.add(2); // set = [1, 2]
myHashSet.contains(1); // return True
myHashSet.contains(3); // return False, (not found)
myHashSet.add(2); // set = [1, 2]
myHashSet.contains(2); // return True
myHashSet.remove(2); // set = [1]
myHashSet.contains(2); // return False, (already removed)
Constraints:
0 <= key <= 106
- At most
104
calls will be made toadd
,remove
, andcontains
.
Solutions
Solution 1
Intuition
Code
const int N = 113;
class MyHashSet {
private:
vector<int> mySet[N];
int find(int linkIndex, int target) {
vector<int> &link = mySet[linkIndex];
for (int i = 0; i < link.size(); i++) {
if (link[i] == target) return i;
}
return -1;
}
public:
MyHashSet() {
}
void add(int key) {
int linkIndex = key % N;
int index = find(linkIndex, key);
if (index == -1) mySet[linkIndex].push_back(key);
}
void remove(int key) {
int linkIndex = key % N;
int index = find(linkIndex, key);
if (index != -1) mySet[linkIndex].erase(mySet[linkIndex].begin() + index);
}
bool contains(int key) {
int linkIndex = key % N;
int index = find(linkIndex, key);
return index != -1;
}
};
/**
* Your MyHashSet object will be instantiated and called as such:
* MyHashSet* obj = new MyHashSet();
* obj->add(key);
* obj->remove(key);
* bool param_3 = obj->contains(key);
*/
Complexity
- Time: O(n)
- Space: O(n)
Top comments (0)