【一天一道Leetcode】设计哈希集合

看那个码农

共 2163字,需浏览 5分钟

 ·

2021-03-15 22:53


本篇推文共计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】套信封问题



☆ END ☆

你与世界

只差一个

公众号

浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报