「LeetCode系列」设计哈希集合问题|刷题打卡

89 阅读2分钟

作者:看那个码农

公众号:看那个码农

本题来源于「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 ,(已移除)

提示:

  1. 0 <= key <= 10^6

  2. 最多调用 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 春招闯关活动」, 点击查看 活动详情