Vison's Blog
所有文章
文章总览
编辑器
Publications
About Me
Search
目录
#toc-container
下载Markdown文件
【2024.04.14】LeetCode每日一题·设计哈希集合
2024年04月14日 14时12分
标签:
LeetCode
哈希表
Easy
## 题目描述 不使用任何内建的哈希表库设计一个哈希集合(HashSet)。 实现`MyHashSet`类: * `void add(key)`向哈希集合中插入值`key`。 * `bool contains(key)`返回哈希集合中是否存在这个值`key`。 * `void remove(key)`将给定值`key`从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。 #### 示例 ```` 输入: ["MyHashSet", "add", "add", "contains", "contains", "add", "contains", "remove", "contains"] [[], [1], [2], [1], [3], [2], [2], [2], [2]] 输出: [null, null, null, true, false, null, true, null, false] 解释: MyHashSet myHashSet = new MyHashSet(); myHashSet.add(1); // set = [1] myHashSet.add(2); // set = [1, 2] myHashSet.contains(1); // 返回 True myHashSet.contains(3); // 返回 False ,(未找到) myHashSet.add(2); // set = [1, 2] myHashSet.contains(2); // 返回 True myHashSet.remove(2); // set = [1] myHashSet.contains(2); // 返回 False ,(已移除) ```` #### 提示 ```` 0 <= key <= 10^6 最多调用 10^4 次 add、remove 和 contains ```` #### 来源 > 来源:力扣(LeetCode) > > 链接:[705. 设计哈希集合](https://leetcode.cn/problems/design-hashset/) ## 解题思路 实现哈希集合需要考虑两个问题:(1)哈希函数;(2)碰撞处理。 对于(1),使用哈希函数`idx = key % MOD`即可处理,其中`MOD`是一个大质数 对于(2),一个简单的方式是使用链地址法解决,对于具有相同哈希函数值的`key`,将其存储在一个链表中;增删改查时遍历改链表即可。 ## 代码 ````cpp class MyHashSet { private: const int N = 10007; vector
> hashset; public: MyHashSet() { hashset.resize(N); } void add(int key) { int idx = key % N; if(this->contains(key)) return; hashset[idx].push_back(key); } void remove(int key) { int idx = key % N; for(auto iter=hashset[idx].begin(); iter!=hashset[idx].end(); iter++){ if(*iter == key){ hashset[idx].erase(iter); return; } } } bool contains(int key) { int idx = key % N; for(auto iter=hashset[idx].begin(); iter!=hashset[idx].end(); iter++){ if(*iter == 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); */ ```` ### 用时和内存 > 执行用时:78 ms,在所有C++提交中击败了57.26%的用户 > > 内存消耗:52.50 MB,在所有C++提交中击败20.11%的用户 >
所有评论
暂无评论
新增评论
评论
邮箱
邮箱仅作验证使用
图形验证码
邮箱验证码
发送验证码
发表评论
所有评论
暂无评论