Go语言题解LeetCode705设计哈希集合
作者:刘09k11 发布时间:2024-03-19 22:30:38
标签:Go,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 ,(已移除)
提示:
0 <= key <= 10^6
最多调用 10^4 次 add、remove 和 contains
思路分析
实现使用了链地址法,解决哈希冲突方法使用了模取余的方法(较简单的)。
这里说下为什么大家说模最好取质数,我的理解是取质数可以让取余后的结果更加均匀,以减少冲突。
举个例子,假如我们取4为模,那么虽然理论上我们应该会让数字均匀落入4个桶中,但是对于下边这个数组:
1,3,5,7,9
所有数字都落入了1,3两个桶中,造成了极大的不均,导致哈希冲突发生频繁。对于一个合数,只要我们构造合数倍数相关的数组,就很容易使哈希冲突变多,所以尽量选用质数。
AC 代码
struct Listnode{
int val;
Listnode* next = nullptr;
Listnode()=default;
Listnode(int val){
this->val = val;
}
};
class MyHashSet {
public:
/** Initialize your data structure here. */
const int prime = 991;
vector<Listnode*> nodes;
MyHashSet(): nodes(prime, nullptr){
}
void add(int key) {
if(nodes[key%prime] == nullptr){
nodes[key%prime] = new Listnode(key);
}else{
Listnode* node = nodes[key%prime];
while(node != nullptr){
if(node->val == key)return;
node = node->next;
}
node = new Listnode(key);
node->next = nodes[key%prime];
nodes[key%prime] = node;
}
}
void remove(int key) {
Listnode* prenode = nodes[key%prime];
if(prenode != nullptr && prenode->val == key){
if(prenode->next != nullptr){
nodes[key%prime] = prenode->next;
delete prenode;
}else{
delete prenode;
nodes[key%prime] = nullptr;
}
return;
}
while(prenode != nullptr && prenode->next != nullptr){
if(prenode->next->val == key){
Listnode* temp = prenode->next;
prenode->next = prenode->next->next;
delete temp;
return;
}
prenode = prenode->next;
}
}
/** Returns true if this set contains the specif ied element */
bool contains(int key) {
Listnode* node = nodes[key%prime];
while(node != nullptr){
if(node->val == key)return true;
node = node->next;
}
return false;
}
};
/**
* Your MyHashSet object will be instantiated and called as such:
* MyHashSet* obj = new MyHashSet();
* obj->add(key);
* obj->remove(key);
* bool param_3 = obj->contains(key);
*/
来源:https://juejin.cn/post/7179208586210312251
0
投稿
猜你喜欢
- 我就废话不多说了,还是直接上代码吧!import osimport xml.dom.minidomimport cv2 as cvImgPa
- 1,定义和注册中间件在注册的中间件中使用:from django.http import HttpResponseRedirect'
- 总体顺序确定需要安装的tensorflow-gpu版本,点击这里拉到最下方,一般是cuda10和cudnn7.4,以及对应的nvidia驱动
- array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副
- 在讨论其返回值前,我们先来介绍以下calcHist()函数的用法:cv2.calcHist()函数cv2.calcHist()函数的作用通过
- 一、介绍这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。虽然这
- 一、什么是shutilshutil可以简单地理解为sh + util ,shell工具的意思。shutil模块是对os模块的补充,主要针对文
- 本文主要介绍Python3.9的一些新特性,如:更快速的进程释放,性能的提升,简便的新字符串函数,字典并集运算符以及更兼容稳定的内部API,
- 近期因为开发一个新的H5+backbone 项目,验证输入手机号 验证码倒计时功能。#如上图所示 要实现验证码的倒计时的效果首先做页面的布局
- vue后台返回base64图片无法显示关于后台接口返回的图片base64格式页面无法显示的问题,我遇到的原因是因为返回的一串内容里面存在空格
- vue+el使用this.$confirm不能阻断代码往下执行在vue+element ui的前端框架中使用el的confirm弹窗,遇到一
- 许多函数式文章讲述的是组合,流水线和高阶函数这样的抽象函数式技术。本文不同,它展示了人们每天编写的命令式,非函数式代码示例,以及将这些示例转
- 什么是 MyBatis?MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 J
- Oracle 数据库启动Oracle shutdown的时候突然断电,导致使用sql/plus启动时无法连接到数据库,具体描述为: conn
- 多数据插入只要写一次insert,可以插入多条数据基本语法:insert into 表名 [(字段列表)] values (值列表), (值
- Jones向量假设光波沿z轴传播,那么其三个方向的电场分量可以表示为Jones矩阵能够保证二维列向量形状不变的运算有无穷多种,但最符合我们直
- 我就废话不多说了,大家还是直接看代码吧~func ReadLine(fileName string) ([]string,error){f,
- 问题背景VSCode是我们开发go程序的常用工具,但是安装VSCode成功后,创建一个.go文件会有如下提示:这个是vscode提示你需要安
- 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想
- 本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法。分享给大家供大家参考,具体如下:问题:请定义一个函数quadratic(