705. Design HashSet
Design a HashSet without using any built-in hash table libraries.
Implement MyHashSet class:
- void add(key) Inserts the value key into the HashSet.
- bool contains(key) Returns whether the value key exists in the HashSet or not.
- void remove(key) Removes the value key in the HashSet. If key 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 < = k e y < = 1 0 6 0 <= key <= 10^6 0<=key<=106
- At most 1 0 4 10^4 104 calls will be made to add, remove, and contains.
From: LeetCode
Link: 705. Design HashSet
Solution:
Ideas:
-
Direct addressing is used since the key range is fixed: 0 to 10^6.
-
A boolean array of size 1000001 is used to store key presence (true = present, false = absent).
-
add(key) sets data[key] = true.
-
remove(key) sets data[key] = false.
-
contains(key) returns the boolean value at data[key].
-
All operations run in O(1) time.
-
calloc initializes the array to false (0) automatically.
Code:
typedef struct {
bool* data;
} MyHashSet;
MyHashSet* myHashSetCreate() {
MyHashSet* set = (MyHashSet*)malloc(sizeof(MyHashSet));
set->data = (bool*)calloc(1000001, sizeof(bool)); // all keys are initially false
return set;
}
void myHashSetAdd(MyHashSet* obj, int key) {
obj->data[key] = true;
}
void myHashSetRemove(MyHashSet* obj, int key) {
obj->data[key] = false;
}
bool myHashSetContains(MyHashSet* obj, int key) {
return obj->data[key];
}
void myHashSetFree(MyHashSet* obj) {
if (obj) {
free(obj->data);
free(obj);
}
}