[LeetCode] Design HashSet 设计HashSet

 

Design a HashSet without using any built-in hash table libraries.html

To be specific, your design should include these functions:数组

  • add(value): Insert a value into the HashSet. 
  • contains(value) : Return whether the value exists in the HashSet or not.
  • remove(value): Remove a value in the HashSet. If the value does not exist in the HashSet, do nothing.


Example:数据结构

MyHashSet hashSet = new MyHashSet();
hashSet.add(1);         
hashSet.add(2);         
hashSet.contains(1);    // returns true
hashSet.contains(3);    // returns false (not found)
hashSet.add(2);          
hashSet.contains(2);    // returns true
hashSet.remove(2);          
hashSet.contains(2);    // returns false (already removed)


Note:函数

    • All 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 HashSet library.

 

这道题让咱们设计HashSet,不能用自带的哈希表的数据结构,并且要咱们主要实现添加,删除,以及判断是否存在,这三个函数。咱们都知道HashSet最有用的地方就是其可以在常数的时间内判断某个元素是否存在,这都得归功于哈希表的做用。可是如今不让咱们用了,但咱们仍是得保证其常数级的查找效率,那么就用空间来换时间吧。既然题目中说了数字的范围不会超过1000000,那么咱们就申请这么大空间的数组,这样对于在HashSet中的数字,咱们就将其标记为1,不在或者删除了的就标记为0,检测的时候就看其值是否为1便可,参见代码以下:post

 

解法一:优化

class MyHashSet {
public:
    /** Initialize your data structure here. */
    MyHashSet() {
        data.resize(1000000, 0);
    }
    
    void add(int key) {
        data[key] = 1;
    }
    
    void remove(int key) {
        data[key] = 0;
    }
    
    /** Returns true if this set contains the specified element */
    bool contains(int key) {
        return data[key] == 1;
    }
    
private:
    vector<int> data;
};

 

咱们能够来适度的优化一下空间复杂度,因为存入HashSet的数字也许不会跨度很大,那么直接就申请长度为1000000的数组可能会有些浪费,那么咱们其实可使用1000个长度为1000的数组来代替,那么就要用个二维数组啦,实际上开始咱们只申请了1000个空数组,对于每一个要处理的元素,咱们首先对1000取余,获得的值就看成哈希值,对应咱们申请的那1000个空数组的位置,在加入元素时,一旦计算出了哈希值,咱们将对应的空数组resize为长度1000,而后根据哈希值和key/1000来肯定具体的加入位置。移除数字同样的,先计算出哈希值,若是对应的数组不为空的话,找到对应的位置并赋值为0。不过你们也能够看出来,咱们在加入元素时会开辟1000的新空间,可是删除这个元素时,并无检测这1000个位置是否均为0,是的话应该删除这1000个新空间。可是这样可能会使得删除函数变慢一些,参见代码以下: ui

 

解法二:this

class MyHashSet {
public:
    /** Initialize your data structure here. */
    MyHashSet() {
        data.resize(1000, vector<int>());
    }
    
    void add(int key) {
        int hashKey = key % 1000;
        if (data[hashKey].empty()) {
            data[hashKey].resize(1000);
        } 
        data[hashKey][key / 1000] = 1;
    }
    
    void remove(int key) {
        int hashKey = key % 1000;
        if (!data[hashKey].empty()) {
            data[hashKey][key / 1000] = 0;
        } 
    }
    
    /** Returns true if this set contains the specified element */
    bool contains(int key) {
        int hashKey = key % 1000;
        return !data[hashKey].empty() && data[hashKey][key / 1000];
    }
    
private:
    vector<vector<int>> data;
};

 

相似题目:url

Design HashMapspa

 

参考资料:

https://leetcode.com/problems/design-hashset/

https://leetcode.com/problems/design-hashset/discuss/185826/C%2B%2B-solution

https://leetcode.com/problems/design-hashset/discuss/193132/Solution-without-boolean-array

https://leetcode.com/problems/design-hashset/discuss/143434/Beats-100-Real-Java-Solution-(Not-boolean-array)

 

LeetCode All in One 题目讲解汇总(持续更新中...)

相关文章
相关标签/搜索