作者:看那个码农
公众号:看那个码农
本题来源于「LeetCode系列」705. 设计哈希集合
题目描述:
不使用任何内建的哈希表库设计一个哈希集合(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 。
代码分析
首先我们来科普一下哈希集合的概念
哈希集合是指能O(1)时间内进行插入和删除,可以保存不重复元素的一种数据结构。
由于题目给出了0 <= key <= 10^6
同时限定了 key 只能是 int
我们可以暴力求解,创建一个10^6 +1长度大小的数组。
题目还强调
只需要关注输入的 key 是否存在,
因此,我们把数组的元素统一设计成 bool 型的,
当某个 key 的对应的数组中的位置取值为 true,说明该 key 存在,
当某个 key 的对应的数组中的位置取值为 false,说明该 key 不存在。
Python 提供了 bool 类型来表示真(对)或假(错),
比如常见的10 > 3比较算式,这个是正确的,在程序里称为真,即我们眼中的对,Python 使用 True 来代表;
比如1 > 10比较算式,这个是错误的,在程序世界里称之为假,即我们眼中的错,Python 使用 False 来代表。
但是这种方法
优点:查找和删除的性能非常快,只用访问 1 次数组,即时间复杂度为O(1);
缺点:使用了过大的空间,如果存储的元素较少时,性价比较低,会占用较多缓存
因此我们的代码表示为
class MyHashSet:
def __init__(self):
self.boolnodes=[False]*1000001
def add(self, key):
self.boolnodes[key]=True
def remove(self, key):
self.boolnodes[key]=False
def contains(self, key):
return self.boolnodes[key]
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情