这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
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 <= 1000000
- 最多调用 10000 次 add、remove 和 contains 。
解题思路
- 我们设计一个哈希集合,首先需要一个哈希函数
- 哈希函数:能够将集合中任意可能的元素映射到一个固定范围的整数值,并将该元素存储到整数值对应的地址上。
如果不考虑空间,我们可以直接设计一个超大的数组,使每个key 都有单独的位置,则不存在冲突;由于题目给出了
0 <= key <= 10^6
数据范围,同时限定了 key 只能是 int。
又因为对于 HashSet 来说,我们只需要关注一个 key 是否存在,而不是 key:value 形式的 HashMap,因此,我们把数组的value设计成 bool 型的。所以我们可以使用Boolean类型数组 hash【key】表示 key值是否存在,key就是数组的下标
代码
class MyHashSet {
boolean[] hash;
/** Initialize your data structure here. */
public MyHashSet() {
hash=new boolean[10000001];
}
public void add(int key) {
hash[key]=true;
}
public void remove(int key) {
hash[key]=false;
}
/** Returns true if this set contains the specified element */
public boolean contains(int key) {
return hash[key];
}
}
/**
* Your MyHashSet object will be instantiated and called as such:
* MyHashSet obj = new MyHashSet();
* obj.add(key);
* obj.remove(key);
* boolean param_3 = obj.contains(key);
*/
- 时间复杂度:O(1)
- 空间复杂度:O(1)