【LeetCode705】设计哈希集合(哈希)

简介: 0 <= key <= 10^6最多调用 104 次 add、remove 和 contains二、思路

一、题目

image.png

提示:


0 <= key <= 10^6

最多调用 104 次 add、remove 和 contains

二、思路

哈希表有个2个关键问题:


哈希函数:将任意值通过哈希函数映射到固定值,可以设哈希表的大小为b a s e basebase,输入哈希函数值为k e y keykey,设计一个简单的哈希函数:h a s h ( k e y ) = k e y m o d b a s e hash(key) = key \quad mod \quad basehash(key)=keymodbase。其中b a s e basebase一般取为质数,可以取987。

哈希表一般使用链地址法,即让每个vector元素是一个链表list。对哈希表的增删改查都是通过hash函数计算后,对这个list进行增删改查即可。

PS:


对vector<list<int>>a进行初始化大小时,如果是直接用vector<list<int>>a(987);是会报错的,可以定义后再用a.resize(987),但是这样是产生对象后才扩容到987,效率更快的写法是:MyHashSet():a(987){},即在构造a时就是987大小了。

在C++的STL中,map或者set可以直接使用find,但是vector或者list是不可以直接使用find的。

三、代码

class MyHashSet {
private:
    vector<list<int>>a;
    int base = 987;
    int hash(int key){
        return key % base;
    }
public:
    MyHashSet(){
        a.resize(987);
    }
    void add(int key) {
        int temp = hash(key);
        for(auto it = a[temp].begin(); it != a[temp].end(); it++){
            if(*it == key){
                return;
            }
        }
        a[temp].push_back(key);
    }
    void remove(int key) {
        int temp = hash(key);
        for(auto it = a[temp].begin(); it != a[temp].end(); it++){
            if(*it == key){
                //注意这里不能写成erase(key)
                a[temp].erase(it);
                return;
            }
        }
    }
    bool contains(int key) {
        int temp = hash(key);
        for(auto it = a[temp].begin(); it != a[temp].end(); it++){
            if(*it == key){
                return true;
            }
        }
        return false;
    }
};
/**
 * 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);
 */

image.png

相关文章
|
6月前
《LeetCode》—— 哈希
《LeetCode》—— 哈希
|
6月前
leetcode-1044:最长重复子串(滚动哈希)
leetcode-1044:最长重复子串(滚动哈希)
119 0
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer II 082. 含有重复元素集合的组合
解决LeetCode平台《剑指 Offer II 082. 含有重复元素集合的组合》题目的Python代码实现,通过深度优先搜索算法找出所有和为特定目标值的数字组合,并在搜索过程中通过排序和跳过重复元素来避免解集中出现重复组合。
40 2
|
5月前
|
算法 数据挖掘 开发者
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
|
5月前
|
存储 SQL 算法
LeetCode 题目 87:递归\动态规划\哈希实现 扰乱字符串
LeetCode 题目 87:递归\动态规划\哈希实现 扰乱字符串
|
6月前
[leetcode] 705. 设计哈希集合
[leetcode] 705. 设计哈希集合
【Leetcode -643.子数组最大平均值Ⅰ -645.错误的集合】
【Leetcode -643.子数组最大平均值Ⅰ -645.错误的集合】
51 0
|
6月前
leetcode-1001:网格照明(自定义哈希集合)
leetcode-1001:网格照明(自定义哈希集合)
40 0
|
算法
动态规划编程题集合(leetcode)
动态规划编程题集合(leetcode)