【算法集训】基础数据结构:十三、哈希表

今天是基础数据结构的最后一个。至此我们的基础数据结构系列就结束了!!!
这几天先告一段落,等期末考试完继续更新算法系列。


哈希表又叫散列表,通常用数组来实现,又叫做哈希数组。

一、概念

常用哈希函数

1、直接定址法;
关键字本身就是哈希值,例如f(x) = x;
2、平方取中法
3、折叠法
4、除留取余法(常用)
f(x) = x % m
5、位与法

哈希冲突解决方法

1、开放定址法
如果发生冲突则寻找下一个空地址。
2、链地址法
发生冲突后不换地址,使用链表将链接到当前的值的后面

第一题 41. 缺失的第一个正数

int hash[500002]; //定义哈希数组int firstMissingPositive(int* nums, int numsSize) {memset(hash, 0, sizeof(hash));  //初始化为0// 遍历数组,传入哈希for(int i = 0; i < numsSize; ++i) {int v = nums[i];//如果值负数或大于500000,那后面就不用看了,因为数组长度只有500000,里面必定有空值。if(nums[i] <= 0 || nums[i] > 500000) {continue;}hash[ v ] = 1;}for(int i = 1; ; ++i) {if(!hash[i]) {return i;}}return -1;
}

第二题 387. 字符串中的第一个唯一字符

int firstUniqChar(char* s) {int hash[26];memset(hash, 0, sizeof(hash));//遍历数组的方法;如果出现一次字符则+1for(int i = 0; s[i]; ++i) {hash[s[i] - 'a']++;}// 遍历数组判断当前对应的哈希表是否为1,返回索引值即可for(int i = 0; s[i]; ++i) {if(hash[s[i] - 'a'] == 1) {return i;}}return -1;
}

第三题 215. 数组中的第K个最大元素

#define BASE 10000
int hash[2 * BASE + 5];int findKthLargest(int* nums, int numsSize, int k) {memset(hash, 0, sizeof(hash));for(int i = 0; i < numsSize; ++i) {int index = nums[i] + BASE;hash[index]++;}for(int i = 2 * BASE; i >= 0; --i) {while( hash[i] ) {k--;hash[i]--;if( k == 0 ) {return i - BASE;}}}return -1;
}

第四题 1. 两数之和

hash[i]代表数字i + hash[i] == target;

/*** Note: The returned array must be malloced, assume caller calls free().*/
//实现哈希表
#define BIT 16 //定义16位,我也不知道什么意思
#define MASK ((1 << BIT) - 1) //说是掩码,就是2^16 - 1 = 65535
#define MAGIC 1000000001  //定义一个边界,用于初始化哈希表
int hash[MASK + 1]; //创建哈希表//初始化哈希表
void HashInit() {//里面的值都赋值为取不到的值,表示为空for(int i = 0; i <= MASK; ++i) {hash[i] = MAGIC;}
}int HashFindAndInsert( int x ) {int v = x & MASK; //于操作,等于将x变为正数,如果不是负数则就是xwhile(1) {//如果当前哈希数组为空则插入if(hash[v] == MAGIC) {hash[v] = x;return v;}else if(hash[v] == x) { //如果是x表明已经插入了,直接返回return v;}v = (v + 1) * MASK;  //如果不满足要求,v往前移动一位,直到满足要求}
}int pos[MASK + 1];
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {int *ret = (int *)malloc(sizeof(int) * 2);*returnSize = 2;HashInit();memset(pos, -1, sizeof(pos));for(int i = 0; i < numsSize; ++i) {int idx = HashFindAndInsert(target - nums[i]);  //得到target - b = a里面的aif(pos[idx] != -1) {ret[0] = pos[idx];ret[1] = i;return ret;}//pos[ HashFindAndInsert(nums[i]) ] = i;}*returnSize = 0;return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/577681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

返利机器人赚佣金工作原理及实现思路探索

返利机器人赚佣金工作原理及实现思路探索 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我将带大家深入探索返利机器人的工作原理和实现思路&…

C++成员函数的两种实现

文章目录 前言一、类内实现二、类外实现 前言 C 中成员函数两种实现&#xff1a; 类内实现 和 类外实现。 一、类内实现 在定义类的时候&#xff0c;直接定义了函数体。 #include <iostream> using namespace std; class Point {public:void setPoint(int x, int y)…

overtureDNS使用介绍

Overture是一个定制的DNS中继服务器。 在此下在二进制版本 https://github.com/shawn1m/overture/releases默认配置文件./config.yml bindAddress: :53 debugHTTPAddress: 127.0.0.1:5555 dohEnabled: false primaryDNS:- name: DNSPodaddress: 119.29.29.29:53protocol: udp…

Python Opencv实践 - 人体姿态检测

本文仍然使用mediapipe做练手项目&#xff0c;封装一个PoseDetector类用作基础姿态检测类。 mediapipe中人体姿态检测的结果和手部跟踪检测的结果是类似的&#xff0c;都是输出一些定位点&#xff0c;各个定位点的id和对应人体的位置如下图所示&#xff1a; 关于mediapipe的pos…

Fastjson中关于json的处理与配置

Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。 无依赖&#xff0c;不需要例外额外的jar&#xff0c;能够直接跑在JDK上。 FastJson在复杂类型的Bean转换Json上会出现一些问题&#xff0c;可能会出现引用的类型&#xff0c;导致Json转换出错&#xff0c…

案例分析:三一重工集团数字化转型

三一重工集团&#xff0c;作为制造业中的数字化转型佼佼者&#xff0c;荣获“全球灯塔工厂”的殊荣&#xff0c;率先采用了物联网、云计算、大数据等尖端技术手段。数字化转型让三一重工步入了全面信息化的管理时代&#xff0c;通过ERP、CRM、HRM等系统的协同运作&#xff0c;实…

第十二章 集合类

12.1集合类概论 java.util包中提供了一些集合类&#xff0c;这些 集合类又被成为容器&#xff0c;提到容器不难想到数组。集合类于数组的不同之处是:数组的长度是固定的 但集合类不同长度是可变的&#xff1a;数组用来存放基本数据类型的数据&#xff0c;集合用来存放对象的引…

Spring Cloud + Vue前后端分离-第7章 核心业务功能开发

Spring Cloud Vue前后端分离-第7章 核心业务功能开发 7-1 课程管理功能开发 课程管理页面美化 1.课程管理页面美化 demo-course.jpg 复制search.html中的部分代码 course.vue 看效果 测试一下新增修改删除效果 1.课程管理页面美化2 scoped:style下的样式只应用于当前组件…

docker的一些思考

1.docker是啥&#xff1f; 2.镜像执行流程 3.一些疑惑和解答 1. 2.

喜报频传!百望云获评“2023数字经济独角兽”称号

“数字经济独角兽”是在数字经济领域具备高成长性、高创新性和高潜力性的企业&#xff0c;他们不仅是数字经济的先锋&#xff0c;是科技创新型企业的典范&#xff0c;也是推动经济发展的新兴引擎。 12月20日&#xff0c;“2023数字经济独角兽大会”在北京大兴区成功举办。大会以…

关于Smartbi登录代码逻辑漏洞的动态情报

一、基本内容 近日&#xff0c;思迈特软件核查发现存在“登录代码逻辑漏洞”问题&#xff0c;重点影响范围涉及Smartbi V9及其以上版本。该漏洞可能导致攻击者利用逻辑缺陷对目标系统进行攻击&#xff0c;造成敏感信息泄露和远程代码执行的风险。 二、相关发声情况 Smartbi是…

.NET 7(C#)配置使用log4net日志框架的方法

log4net 是一个高效、灵活且广泛使用的日志记录库&#xff0c;专门用于 .NET 框架。它是 Apache 的一个开源项目Apache log4j框架在Microsoft .NET平台的实现。log4net 旨在提供一个简单、易用但功能强大的日志系统。本文主要介绍.NET 7 中配置使用log4net&#xff0c;以及相关…

电路设计(7)——窗口比较器的multism仿真

1.功能设计 构建一个窗口比较器的电路&#xff0c;在输入电压大于3.5v&#xff0c;小于0.8v时&#xff0c;蜂鸣器报警&#xff0c;输入电压在0.8v到3.5v之间时&#xff0c;不报警。 整体电路如下&#xff1a; 2.设计思路 在输入端&#xff0c;采取电阻分压的方式&#xff0c;输…

【C++】开源:libmodbus通信协议库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍libmodbus通信协议库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#x…

电脑开机快捷启动,启动菜单没有u盘怎么办

电脑开机快捷启动键找不到u盘怎么办 对于快捷启动键找不到u盘的问题&#xff0c;小编很了解其中的门道&#xff0c;因为开机找不到u盘是我们使用电脑时候的常见问题。那么我们到底要如何解决开机找不到u盘的问题呢?其实方法还是蛮简单的&#xff0c;下面小编就来教大家电脑开…

达梦数据库问题集

达梦数据库问题集 1.达梦库实例 页大小 16K 簇大小 32页 列[LINK]附近出现错误: 在使用达梦数据库时&#xff0c;查询SQL中涉及XML,EXCHANGE,DOMAIN,link字段&#xff0c;在达梦中是关键字&#xff0c;SQL报关键词不能使用的错误。文章来源地址:https://www.yii666.com/art…

java数据结构与算法刷题-----LeetCode633. 平方数之和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 思路一&#xff1a;双指针 可以使用双指针&#xff0c;不断从两个方向匹配…

IP代理科普| 共享IP还是独享IP?两者的区别与优势

通俗地讲&#xff0c;共享IP就像乘坐公共汽车一样&#xff0c;您可以到达目的地&#xff0c;但将与其他乘客共享旅程&#xff0c;座位很可能是没有的。独享IP就像坐出租车一样&#xff0c;您可以更快到达目的地&#xff0c;由于车上只有您一个人&#xff0c;座位是您一个人专用…

ComfyUI激活中文

comfyui中文地址如下&#xff1a; https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translationhttps://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translation如何安装&#xff1f; 1. git安装 进入项目目录下的custom_nodes目录下&#xff0c;然后进入控制台&#xff0c;运…

获取京东商品信息:使用详情API的步骤与技巧

注册并登录京东开放平台&#xff1a;首先&#xff0c;你需要在京东开放平台上注册一个账号并获取必要的API凭证&#xff0c;如appkey和appsecret。构建请求URL&#xff1a;根据京东详情API的文档&#xff0c;确定需要查询的商品类目和商品ID。然后&#xff0c;使用适当的查询参…