【算法学习】哈希表篇:哈希表的使用场景和使用方法

article/2025/8/14 21:00:35

算法学习:

https://blog.csdn.net/2301_80220607/category_12922080.html?spm=1001.2014.3001.5482

前言:

在之前学习数据结构时我们就学习了哈希表的使用方法,这里我们主要是针对哈希表的做题方法进行讲解,都是leetcode上的经典题,各位可以自己做一遍再来看一下,主要抽取了几个经典的题

目录

1. 哈希表的基础知识

1.1 哈希表是什么

1.2 哈希表的作用

1.3 什么时候用哈希表

1.4 哈希表的应用场景

2. 哈希表经典例题

2.1 两数之和

2.2 存在重复元素||

2.3 字母异位词分组

3. 总结


1. 哈希表的基础知识

1.1 哈希表是什么

简单点来说哈希表就是一个存储数据的容器,但是能够对出现的数据进行标记

1.2 哈希表的作用

能够实现快速查找指定的数据,时间复杂度往往为O(1)

1.3 什么时候用哈希表

频繁的查找数据时

1.4 哈希表的应用场景

1. 直接使用哈希表这个数据类型

2. 在合适的场景使用数组来模拟哈希表

解释:

2、3:当我们需要频繁查找数据的时候我们就可以想到要用哈希表,哈希表的时间复杂度为o(1),空间复杂度为o(n)同时也要考虑是否可以用二分,二分时间复杂度为o(logn),也非常快,而且二分没有时间开销
4:除了之间使用函数提供给我们的哈希表外,我们也可以用数组模拟创建一个简易的哈希表,但这种只适用于元素少的情况,比如让我们统计字符串中各字符出现次数,我们就可以用数组 int hash[26]模拟一下

2. 哈希表经典例题

2.1 两数之和

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

算法原理:

解法一:暴力枚举

在这个暴力枚举中我们来考虑一种新的枚举思路

比如本题,按照之前的枚举策略,我们是要让当前位置(cur)与后面位置的数字依次相加,然后看是否有满足条件的数字

现在我们来看一种新的枚举思路,就是让所有位置的数字,与它前面位置的数字相加,然后判断是否有满足条件的两个数字这样的思路也能保证让所有的数两两相加,而且在处理一些细节上更有优势,尤其是本题,下面我们结合本题来感受一下

比如上面我们提到的这个队列,按照原来的思路,我们先来找一下2后面是否有合适的数字,使得2与其相加等于target,为了减小时间复杂度我们这里要用哈希表的方法,哈希表中存的值是数组中元素和对应的下标<nums[i,i>,但是如果我们是找当前元素后面的值时,我们就需要先提前将数组中所有数字及它们对应的下标先放入哈希表中,但这就会导致一些问题

比如这样一个数组和target值,如果我们按照原策略先将所有数字和对应下标放入哈希表中的话因为有两个3,在第一个3及它对应的下标放入哈希表中后,当放第二个3及它对应的下标时,就会把前一个存的3的下标给覆盖掉,所以我们还需要额外的操作对重复的数字的多个下标进行保存

但是如果我们采取的策略二,我们创建哈希表的时机就会发生一些变化,比如我们现在位置在2,我们是要从前面的位置找合适的数,前面没有数,所以哈希表中自然也没有,然后我们可以将2的值及它的下标放入哈希表中,同时让cur++,这样做的优化点是什么呢?

此时假如我们再遇到上面的情况(两个3),我们在第一个3时査找它前面是否有合适的数(前面的数己经放入哈希表了)时,会发现没有,然后我们把它放入哈希表中,然后到第二个3,我们发现哈希表中hash[target-3]存有一个下标,我们就找到满足条件的下标了

假如我们现在的target不是6,而是14,那我们在经过第二个3后,虽然会把哈希表中3对应的下标替换掉,但是仍不影响最终结果

思考一下:其实第二种策略比第一种策略的优化之处就是,策略二在替换一个数的坐标之前,是事先知道这个数字两两相加不满足条件的,所以保留一个与其它数字相加即可,而第一个数字则是在没考虑这种情况之前就只把重复数字只留下一个

代码实现:

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> hash;for(int i=0;i<nums.size();i++){if(hash.count(target-nums[i])) return {hash[target-nums[i]],i};hash[nums[i]]=i;}return {-1,-1};}
};

2.2 存在重复元素||

219. 存在重复元素 II

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

示例 1:

输入:nums = [1,2,3,1], k = 3
输出:true

示例 2:

输入:nums = [1,0,1,1], k = 1
输出:true

示例 3:

输入:nums = [1,2,3,1,2,3], k = 2
输出:false

提示:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • 0 <= k <= 105

这道题就可以用上面的思路来解,挺简单的,可以练练手

代码实现:

class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int,int> hash;for(int i=0;i<nums.size();i++){if(hash.count(nums[i])&&i-hash[nums[i]]<=k) return true;hash[nums[i]]=i;}return false;}
};

2.3 字母异位词分组

49. 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]输出: [[""]]

示例 3:

输入: strs = ["a"]输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

算法原理:

解释:

这道题就很考验我们对哈希表的使用,我们在这里创建的哈希表类型是一个<string,vector<string>>类型的哈希表,我们要做的是把所有的字母异位词放在一起,那么我们首先就需要判断哪些词是字母异位词,在这里我们有一个很巧的方法去判断,我们可以把这些字符串排序,字母异位词排序后是相等的,就如左边那样(“eat",“tea“排序后都是“aet"),然后让排序后的字符串作为key值,字母异位词放在同一个key值后,最后再从哈希表中把这些字符串数组提取出来即可

代码实现:

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string,vector<string>> hash;for(int i=0;i<strs.size();i++){string tmp=strs[i];sort(strs[i].begin(),strs[i].end());hash[strs[i]].push_back(tmp);}vector<vector<string>> ret;for(auto& [x,y]:hash)ret.push_back(y);return ret;}
};

3. 总结

以上就是几个关于哈希表的经典例题,都不算难,哈希表在算法题里出现的比例还是非常高的,一般都是作为一种数据类型存在的,掌握还是很有必要的

本篇笔记:

感谢各位大佬观看,创作不易,还望各位大佬点赞支持!!


http://www.hkcw.cn/article/hUBIcCyAcW.shtml

相关文章

HDFS详解

一、HDFS 概述 定位与特点 分布式文件系统&#xff1a;HDFS&#xff08;Hadoop Distributed File System&#xff09;是 Hadoop 生态的核心组件&#xff0c;专为海量数据存储和批处理设计。 核心设计原则&#xff1a; 高容错性&#xff1a;数据自动多副本冗余&#xff0c;支持…

【数据结构】String字符串的存储

目录 一、存储结构 1.字符串常量池 2.字符串哈希表 2.1结构 2.2基础存储单位 2.2.1键对象 2.2.2值对象 二、存储过程 1.搜索 2.创建 三、存储位置 四、存储操作 1.new新建 2.intern入池 这是String类的详解&#xff1a;String类变量 一、存储结构 1.字符串常量池…

数据结构大作业——家谱管理系统(超详细!完整代码!)

目录 设计思路&#xff1a; 一、项目背景 二、功能分析 查询功能流程图&#xff1a; 管理功能流程图&#xff1a; 三、设计 四、实现 代码实现&#xff1a; 头文件 结构体 函数声明及定义 创建家谱树头结点 绘制家谱树&#xff08;打印&#xff09; 建立右兄弟…

北京将有7级大风小冰雹 雷电蓝色预警发布

6月1日17时50分,北京发布雷电蓝色预警,预计当天20时至次日2时,自西向东将有雷阵雨天气,局地短时雨强较大,并伴有7级左右短时大风和小冰雹,请注意防范。明天上午至中午前后依旧会出现分散性雷阵雨,雨量总体不大。午后至前半夜北风增强,阵风明显,外出时请做好防风措施,…

专家:印太战略实质是霸权工具 不会得逞

针对美国防长赫格塞思在香格里拉对话会上涉及中国的部分表态,有中国学者指出,美国所谓的“印太战略”实质上是霸权工具,不会得逞。在对话会上,赫格塞思再次提到所谓的“印太战略”,并呼吁亚太地区同盟国和合作伙伴国与美国一起构筑更现实的战略关系。国防大学教授孟祥青表…

SCNN(Spatial CNN) 模型学习记录

目录 1.模型架构 2.核心模块SCNN_*分析 SCNN&#xff08;Spatial As Deep: Spatial CNN for Traffic Lane Detection&#xff09;是一种专为交通车道线检测任务设计的深度神经网络架构&#xff0c;由中国科学院计算技术研究所提出&#xff0c;旨在在语义分割框架中增强空间信…

Lerobot框架使用(含本地数据训练)

本文包含从安装环境到完整使用Lerobot框架进行算法复现全流程。 A Install LeRobot 安装miniconda管理python环境 Linux mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/minicon…

小红书 web x-s x-t X-Mns 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 cp execjs.compile(open(v…

国产化中间件基本使用_东方通(TongWeb7.0.E.6_P2)

tongweb开发操作文档 1、前期准备 进入官网申请使用,官网地址:https://www.tongtech.com 若提供的安装程序的授权文件已过期,请去官方网站重新申请。 2、安装部署 2.1、下载安装Tongweb 进入官网申请试用,官方会提供响应的嵌入式安装包及试用授权证书(3个月) 申请…

010302-oss_反向代理_负载均衡-web扩展2-基础入门-网络安全

文章目录 1 OSS1.1 什么是 OSS 存储&#xff1f;1.2 OSS 核心功能1.3 OSS 的优势1.4 典型使用场景1.5 如何接入 OSS&#xff1f;1.6 注意事项1.7 cloudreve实战演示1.7.1 配置cloudreve连接阿里云oss1.7.2 常见错误1.7.3 安全测试影响 2 反向代理2.1 正向代理和反向代理2.2 演示…

FREERTOS+LWIP+IAP实现TCP、HTTP、网页访问并固件升级、更新配置 (三)lwip实现httpd服务并在web访问

前言 在前两篇文章中配置freeRTOS和&#xff0c;并实现了TCP、UDP的通信协议&#xff0c;现在终于轮到重头戏lwip的httpd服务&#xff0c;LWIP官方例程中是有很多自带的网页的&#xff0c;但是远远不够满足实际项目的使用需求&#xff0c;因此我也是踩了很多坑&#xff0c;从前…

lighthouse(灯塔)前端性能测试工具

前端性能测试工具之lighthouse灯塔 介绍下载链接使用方法前端性能指标解读 介绍 Lighthouse 是一个开源的自动化工具&#xff0c;用来测试前端页面性能&#xff0c;反馈页面问题以提升页面体验。可以联合谷歌浏览器&#xff0c;作为插件导入&#xff0c;开启后可测试页面性能 …

Ai智能体四:互动式 AI 聊天助手:前端实现

在现代 web 应用中,集成智能对话功能已经成为提升用户体验的重要手段之一。本文将介绍如何通过 Vue 3 和 Element Plus 构建一个高效的 AI 聊天助手界面,并详细讲解其实现原理和功能。 1. 整体架构 该聊天界面分为 左侧边栏 和 右侧内容区域,实现了清晰的布局结构,左侧边…

Spring Boot 3.x 引入springdoc-openapi (内置Swagger UI、webmvc-api)

接触的原因 因开发自己的项目时&#xff0c;写接口文档很繁琐&#xff0c;查到后端都在用swagger等接口工具来记录接口文档&#xff0c;于是学习了一下&#xff0c;本文记录个人配置过程&#xff0c;有问题欢迎指正交流&#x1f601; Swagger&#xff1a; Swagger是一种Rest AP…

OpenWebUI配置异常的外部模型导致页面无法打开

一、使用Ollama关闭OpenAI OpenWebUI自带OpenAI的API设置&#xff0c;且默认是打开的&#xff0c;默认情况下&#xff0c;启动后&#xff0c;会不断的去连https://api.openai.com/v1&#xff0c;但是无法连上&#xff0c;会报错&#xff0c;但是不会影响页面&#xff0c;能正常…

Postman(Apifox)调用WebServicer接口

postman调用WebServicer接口 前言 Postman使用方法Apifox使用方法参数与配置请求代码(当然一般开发会给一个样例)步骤 前言 之前都是使用SoapUI测试WebServicer接口,由于工作所需,需要使用Postman测试工具 Postman使用方法 可以直接在请求里写全部的wsdl地址 ,参数会自动带进…

DeepSeek本地化部署实践:Xinference框架+OpenWebUI实现DeepSeek-r1推理跑在国产GPU之上

近日&#xff0c;我部门从供应商那儿借来一台高算力服务器&#xff0c;用来尝试本地化部署DeepSeek。该服务器型号为ASUS ESC8000A-E11&#xff0c;具体配置如下&#xff1a; CPU&#xff1a;AMD EPYC 7702&#xff08;64核&#xff09;* 2 GPU&#xff1a;&#xff08;天数智…

Android WebRTC集成及JNI性能优化实战指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;WebRTC是一个开源项目&#xff0c;旨在实现浏览器间无需插件的实时通信&#xff0c;包括音频、视频通话及数据共享。在Android平台上&#xff0c;其实施涉及使用JNI接口进行Java与C/C代码的交互。本压缩包内容预…

【前端】超链接标签(a标签)之href属性、target属性

文章目录 一、a标签1、href属性&#xff08;1&#xff09;跳转至网络链接页面&#xff08;2&#xff09;跳转至其它工程页面&#xff08;3&#xff09;跳转至本界面 2、target属性 二、感谢观看&#xff01; 一、a标签 a标签即超链接标签&#xff0c;根据名字我们就能知道它是…

【前端开发】一文带你快速入门JavaScript(下)Web 前端必备程序语言 | 条件语句与循环结构

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…