【一天一道Leetcode】设计哈希集合
本篇推文共计2000个字,阅读时间约3分钟。
01
题目描述
题目描述:
不使用任何内建的哈希表库设计一个
哈希集合(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 ,(已移除)
提示:
1. 0 <= key <= 10^6
2. 最多调用10^4次add、remove 和 contains。
02
方法和思路
首先我们来科普一下哈希集合的概念。
哈希集合是指能O(1)时间内进行插入和删除,可以保存不重复元素的一种数据结构。
由于题目给出了0 <= key <= 10^6的数据范围,
同时限定了key只能是int。
我们可以暴力求解,创建一个10^6 +1
长度大小的数组。
题目还强调
只需要关注输入的 key 是否存在,
因此,我们把数组的元素统一设计成 bool 型的,
当某个 key 的对应的数组中的位置取值为 true,说明该 key 存在,
当某个 key 的对应的数组中的位置取值为 false,说明该 key 不存在。
Python提供了bool类型来表示真(对)或假(错)
比如:
1.常见的10 > 3比较算式,这个是正确的,在程序里称为真,即我们眼中的对,
Python 使用 True 来代表;
2.常见的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]
【年终总结】你好2021,再见2020。
【快速写好毕业论文】你不得不知晓的七个常用文献搜索平台
【秋招纪实录】一篇特别正经的【腾讯】求职经验分享
【一天一道Leetcode】回文字符串-最少分割次数
【一天一道Leetcode】用栈实现队列
【一天一道Leetcode】套信封问题
你与世界
只差一个
公众号
评论