DEV Community

Wenqi Jiang
Wenqi Jiang

Posted on

705. Design HashSet

705. Design HashSet

Description

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)
Enter fullscreen mode Exit fullscreen mode

Constraints:

  • 0 <= key <= 106
  • At most 104 calls will be made to addremove, and contains.

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);
 */
Enter fullscreen mode Exit fullscreen mode

Complexity

  • Time: O(n)
  • Space: O(n)

Top comments (0)

An Animated Guide to Node.js Event Loop

Node.js doesn’t stop from running other operations because of Libuv, a C++ library responsible for the event loop and asynchronously handling tasks such as network requests, DNS resolution, file system operations, data encryption, etc.

What happens under the hood when Node.js works on tasks such as database queries? We will explore it by following this piece of code step by step.