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
- 最多调用 104 次 add、remove 和 contains 。
**进阶:**你可以不使用内建的哈希集合库解决此问题吗?
方法一:强撸
解题思路
- 设计哈希表的主要问题是解决哈希冲突,解决哈希冲突的经典方案有:
HashMap
使用的 链地址法ThreadLocal
使用的 开放地址法
- 但是上面两种都不想用,只想强撸!(今日带娃~)
参考代码
class MyHashSet {
private int[] values;
/** Initialize your data structure here. */
public MyHashSet() {
values = new int[1000_001];
Arrays.fill(values, -1);
}
public void add(int key) {
values[key] = key;
}
public void remove(int key) {
values[key] = -1;
}
/** Returns true if this set contains the specified element */
public boolean contains(int key) {
return values[key] > -1;
}
}
执行结果
- 结果感人~