当前位置: 首页 > news >正文

专题十四_哈希表_算法专题详细解答

目录

哈希表简介

1. 两数之和(easy)

解析:

解法一:暴力:

解法二:哈希O(N)

总结:

2. 判断是否互为字符重排(easy)

解析:

哈希:

总结:

3. 存在重复元素 I(easy)

解析:

总结:

4. 存在重复元素 II(easy)

解析:

解法一:暴力O(N^2)

解法二:哈希O(N)

总结:

5. 字⺟异位词分组(medium)

解析:

哈希:

总结:

哈希表相对来说还是比较简单的,但是这些提提远远不够,只能说给大家进行熟悉什么是哈希表,这里面所有的题目可能只是以后某个题目里面的一小步,所以我们慢点学,一定可以成功的~


哈希表简介

1.哈希表是什么?

存储数据的键值对 <int,int>

2.有什么作用?

“快速查找”某个元素                 时间:O(1)    空间:O(N)

3.什么时候用哈希表?

频繁查找一个某一个数的时候,二分(logN)

4.怎么用哈希表?

1.容器(哈希表)

2.用数组模拟简单哈希表     <index,n[index]>

1)字符串中的“字符”  26个字符

2)数据范围很小的时候

那么就就如例题,来彻底了解哈希算法:

1. 两数之和(easy)

leetcode第一题,题目非常好理解,就是找到数组中两个数字的和等于target

解析:

解法一:暴力:

就是两层for循环遍历,每次都从当前位置的下一个数开始寻找,时间复杂度O(N^2)但是还是能过的。

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v;int a=0,b=0;int f=0;for(int i=0;i<nums.size();i++){int a=i;for(b=a+1;b<nums.size();b++){if(nums[a]+nums[b]==target){f=1;v.push_back(a);v.push_back(b);break;}}}if(f==0){v.push_back(0);v.push_back(0);}return v;}
};

解法二:哈希O(N)

这里利用哈希的查找特点,只需要在O(1)下就能找到当前值是否在hash表里面存在。

但是这里采用的是向前遍历的办法。为什么不采用向后遍历?那么就会多麻烦一步:

如果向后查找,首先就是将整个数组nums的值全部放入hash表里面,然后在遍历当前值的时候来确定是否有值满足能够保证加上当前值==target,那么此时举个例子:

假如当前值遍历到4,然后去计算x=target - nums[i] = 8 - 4 = 4;那么就说明要补充的值也是4,就去hash表里面进行查找,那么还是找到一个存在的值是自己,就会直接返回现在当前的下标返回两次。所以这里要单独判单是否会存在除了自己本身位置外的结果。

那么向下面这种代码的情况就只会去找当前位置之前的元素,因为当前位置以及后面的所有元素都还没有倍添加到hash表内,就不会出现重复查找同一个元素的情况。

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

总结:

题目不是很难,注意是要学会优化的思想来解决,合理运用哈希表的查找功能,及大优化时间复杂度。

2. 判断是否互为字符重排(easy)

题目意思真的太简单了,就一眼哈希

解析:

哈希:

1.就是先比较两个字符串的长度,如果连长度都不满足,那肯定就不构成重复的字符串

2.然后将s1的所有字符全部都添加到hash内,再让hash内s1字符出现的次数剪掉s2中的字符,如果出现<=0的情况却还遇到该字符,就说明s1 与 s2 相同字符的个数对不上,直接返回false

class Solution {
public:bool CheckPermutation(string s1, string s2) {int n=s1.size(),m=s2.size();if(n!=m) return false;unordered_map<char,int> hash;for(int i=0;i<n;i++)hash[s1[i]]++;for(int i=0;i<n;i++)if(hash[s2[i]]>0) hash[s2[i]]--;else return false;return true;}
};

总结:

题目真的不难,这题就真的很经典,适合熟练掌握hash的用法。

3. 存在重复元素 I(easy)

我嘞个豆芽,这题一眼哈希,真的简单啊,找是否出现过相同的元素

解析:

那么只需要判断当前值存在hash表里面的次数是否达到两次,如果是,就说明有重复的元素直接返回true

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

总结:

还是非常好对hash表有个熟练的理解,其实虽然这种题简单,但是只要学熟练了,这个步骤也就是苦难题里面的一小步,所以还得熟练掌握才行。

4. 存在重复元素 II(easy)

题目意思还是很简单的,就是找两个相同的元素,但是要满足两个元素的下标只差满足<=k

解析:

解法一:暴力O(N^2)

如果暴力的话这题就真的太麻烦了,必须要对数组的每一个数都要进行向后遍历一次来查找重复的值,绝对会超时的,那么就要想办法减少这种重复的操作。

解法二:哈希O(N)

题目意思只是说要找到两个相同的元素下标只差小于k那么我从nums数组第一个元素开始遍历的时候就要开始考虑hash当前元素只存当前元素的最大下标值,这样就可以做到,在访问到后面同一个元素的时候就会只用减去当前元素前一个位置的下标,不会出现在减去最前面元素的情况,因为当离我们最近的元素的最大下标减去后还不满足条件的话,就不会存在符合条件的下标了,就只能继续往后进行遍历。

那么每当不满足情况的时候,我就将当前元素的下标进行更新,更新成最大的下标,这样为下一次相减做准备。

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

总结:

这里只是运用了hash查找和更新值的效果,但主要是思想的体现,要想到能够怎么样进行算法的优化。将时间复杂度降低到O(N).

5. 字⺟异位词分组(medium)

题目意思还是比较简单的,就是将所有字符相同的字符串存在同一个vector<string>里面

解析:

哈希:

只需要遍历一遍数组,将每一个字符串进行排序,然后判断哈希表里面是否存在这个已经排序完成的字符串,如果是,就可以添加到ret已经出现过的位置即可,但是注意这里要添加的是原来未排序的字符串,所有要提前准备好一个s数组=strs来让他进行排序。

那么怎么添加到ret内呢?

这里就是用j来记录每一个不存在哈希表内的字符串时,让当前hash<string,int>进行j++,这样就能对应道ret这个二维数组内的第几行。,那么这时候就要对ret新添加一行:

ret.push_back(vector<string>());

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> ret;int n=strs.size();vector<string> s=strs;unordered_map<string,int> hash;int j=0;for(int i=0;i<n;i++){sort(s[i].begin(),s[i].end());if(hash.count(s[i])==0) hash[s[i]]=j++,ret.push_back(vector<string>());ret[hash[s[i]]].push_back(strs[i]);}return ret;}
};

总结:

哈希表相对来说还是比较简单的,但是这些提提远远不够,只能说给大家进行熟悉什么是哈希表,这里面所有的题目可能只是以后某个题目里面的一小步,所以我们慢点学,一定可以成功的~

总结一下吧~这一章对我的收获很大,希望对你也是!!!

相关文章:

专题十四_哈希表_算法专题详细解答

目录 哈希表简介 1. 两数之和&#xff08;easy&#xff09; 解析&#xff1a; 解法一&#xff1a;暴力&#xff1a; 解法二&#xff1a;哈希O(N) 总结&#xff1a; 2. 判断是否互为字符重排&#xff08;easy&#xff09; 解析&#xff1a; 哈希&#xff1a; 总结&…...

C++源码生成·序章

文章目录 C源码生成序章1 概述1.1 前言1.2 Python 易用性简介 2 使用 python 生成 c 源码2.1 运行脚本2.2 结果 3 项目启动3.1 项目概述3.2 环境准备3.3 克隆仓库3.4 查看标签&#xff08;Tags&#xff09;3.4 根据标签拉取代码3.5 后续步骤 C源码生成序章 1 概述 1.1 前言 …...

Android中的MVP模式

MVP&#xff08;Model-View-Presenter&#xff09;架构在 Android 开发中是一种流行的架构模式&#xff0c;它将业务逻辑和 UI 代码分离&#xff0c;通过 Presenter 来处理用户的操作和界面更新。MVP 提高了代码的可维护性和测试性&#xff0c;特别是 Presenter 中的逻辑可以单…...

kebuadm部署k8s集群

官方文档&#xff1a; Installing kubeadm | Kubernetes 切记要关闭防⽕墙、selinux、禁用交换空间&#xff0c; cpu核⼼数⾄少为2 内存4G kubeadm部署k8s⾼可用集群的官方文档&#xff1a; Creating Highly Available Clusters with kubeadm | Kubernetes 你需要在每台…...

Unity3D学习FPS游戏(2)简单场景、玩家移动控制

前言&#xff1a;上一篇的时候&#xff0c;我们已经导入了官方fps的素材&#xff0c;并且对三维模型有了一定了解。接下来我们要构建一个简单的场景让玩家能够有地方移动&#xff0c;然后写一个简单的玩家移动控制。 简单场景和玩家移动 简单场景玩家移动控制玩家模型视野-摄像…...

网上的 AQS 文章让我很失望

一、AQS 很多人都没有讲明白 &#x1f914; 翻看了网上的 AQS&#xff08;AbstractQueuedSynchronizer&#xff09;文章&#xff0c;质量参差不齐&#xff0c;大多数都是在关键处跳过、含糊其词&#xff0c;美其名曰 “传播知识” 。 大多数都是进行大段的源码粘贴和注释&…...

滑动窗口子串

文章目录 滑动窗口一、无重复字符的最长子串二、找到字符串中所有字母异位词 子串三、和为 K 的子数组四、滑动窗口最大值五、最小覆盖子串 滑动窗口 一、无重复字符的最长子串 题目链接 &#xff08;方法一&#xff1a;暴力枚举&#xff09; &#xff08;方法二&#xff…...

【windows11 提示“Microsoft Visual C++ Runtime Library Runtime Error】

windows11 提示“Microsoft Visual C++ Runtime Library Runtime Error” 问题描述解决方法郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: windows OS:windows11 问题描述 解决方法 下载VisualCppRedist_AIO_x86_x64.exe 安…...

【leetcode|哈希表、动态规划】最长连续序列、最大子数组和

目录 最长连续序列 解法一&#xff1a;暴力枚举 复杂度 解法二&#xff1a;优化解法一省去二层循环中不必要的遍历 复杂度 最大子数组和 解法一&#xff1a;暴力枚举 复杂度 解法二&#xff1a;贪心 复杂度 解法三&#xff1a;动态规划 复杂度 最长连续序列 输入输…...

【人工智能】掌握深度学习中的时间序列预测:深入解析RNN与LSTM的工作原理与应用

深度学习中的循环神经网络&#xff08;RNN&#xff09;和长短时记忆网络&#xff08;LSTM&#xff09;在处理时间序列数据方面具有重要作用。它们能够通过记忆前序信息&#xff0c;捕捉序列数据中的长期依赖性&#xff0c;广泛应用于金融市场预测、自然语言处理、语音识别等领域…...

今日开放!24下软考机考「模拟练习平台」操作指南来啦!

2024年下半年软考机考模拟练习平台今日开放&#xff0c;考生可以下载模拟作答系统并登录后进行模拟练习&#xff0c;熟悉答题流程及操作方法。 一、模拟练习时间 2024年下半年软考机考模拟练习平台开放时间为2024年10月23日9:00至11月6日17:00&#xff0c;共15天。 考生可以在…...

合并.md文档

需求&#xff1a;将多个.md文档合并成一个.md文档。 方法一&#xff1a;通过 type 命令 参考内容&#xff1a;多个md文件合并 步骤&#xff1a; 把需要合并的 .md 文档放入到一个文件夹内。修改需要合并的 .md 文档名&#xff0c;可以在文档名前加上 1.2.3 来表明顺序&#x…...

10月18日笔记(基于系统服务的权限提升)

系统内核漏洞提权 当目标系统存在该漏洞且没有更新安全补丁时&#xff0c;利用已知的系统内核漏洞进行提权&#xff0c;测试人员往往可以获得系统级别的访问权限。 查找系统潜在漏洞 手动寻找可用漏洞 在目标主机上执行以下命令&#xff0c;查看已安装的系统补丁。 system…...

【STM32 Blue Pill编程实例】-控制步进电机(ULN2003+28BYJ-48)

控制步进电机(ULN2003+28BYJ-48) 文章目录 控制步进电机(ULN2003+28BYJ-48)1、步进电机介绍2、ULN2003步进电机驱动模块3、硬件准备及接线4、模块配置3.1 定时器配置3.2 ULN2003输入引脚配置4、代码实现在本文中,我们将介使用 STM32Cube IDE 使用 ULN2003 电机驱动器来控制28B…...

监督学习、无监督学习、半监督学习、强化学习、迁移学习、集成学习分别是什么对应什么应用场景

将对监督学习、无监督学习、半监督学习、强化学习、迁移学习和集成学习进行全面而详细的解释&#xff0c;包括定义、应用场景以及具体的算法/模型示例。 1. 监督学习 (Supervised Learning) 定义&#xff1a;监督学习是一种机器学习方法&#xff0c;其中模型通过已知的输入数…...

WSL2 Linux子系统调整存储位置

WSL2 默认不支持修改Linux 安装路径&#xff0c;官方提供的方式&#xff0c;只有通过导出、导入的方式实现Linux子系统的迁移。 修改注册表的方式官方不推荐&#xff0c;没有尝试过&#xff0c;仅提供操作方式(自行评估风险&#xff0c;建议备份好数据) 1. 打开 **注册表编辑器…...

Shiro授权

一、定义与作用 授权&#xff08;Authorization&#xff09;&#xff0c;也称为访问控制&#xff0c;是确定是否允许用户/主体做某事的过程。在Shiro安全框架中&#xff0c;授权是核心组件之一&#xff0c;它负责控制用户对系统资源的访问权限&#xff0c;确保用户只能访问其被…...

算法题总结(十五)——贪心算法(下)

1005、K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可…...

《深度学习》【项目】自然语言处理——情感分析 <下>

目录 一、了解项目 1、任务 2、文件内容 二、续接上篇内容 1、打包数据&#xff0c;转化Tensor类型 2、定义模型&#xff0c;前向传播函数 3、定义训练、测试函数 4、最终文件格式 5、定义主函数 运行结果&#xff1a; 一、了解项目 1、任务 对微博评论信息的情感分…...

postgresql是国产数据库吗?

PostgreSQL不是国产数据库。但是PostgreSQL对国产数据库的发展有着重要影响&#xff0c;许多国产数据库产品是基于PostgreSQL进行二次开发的。 PostgreSQL的开源特性也是其受欢迎的重要原因之一。开源意味着任何人都可以查看、修改和使用PostgreSQL的源代码。这使得PostgreSQL…...

BilibiliVideoDownload跨平台视频下载工具:从安装到高级配置的完整指南

BilibiliVideoDownload跨平台视频下载工具&#xff1a;从安装到高级配置的完整指南 【免费下载链接】BilibiliVideoDownload Cross-platform download bilibili video desktop software, support windows, macOS, Linux 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibil…...

Linux上运行Cursor编辑器:AppImage打包与AI编程环境搭建指南

1. 项目概述&#xff1a;一个为Linux用户定制的代码编辑器如果你是一名长期在Linux环境下工作的开发者&#xff0c;尤其是习惯了使用VS Code这类现代编辑器&#xff0c;但又对某些AI辅助编程工具&#xff08;比如Cursor&#xff09;的便捷性念念不忘&#xff0c;那么你很可能已…...

通过用量看板直观比较不同大模型api的token消耗效率

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过用量看板直观比较不同大模型API的Token消耗效率 对于需要持续调用大模型API的开发者或团队而言&#xff0c;理解并控制成本是项…...

5G网络部署挑战与云原生技术解决方案

1. 5G网络部署的核心挑战与技术演进5G作为第五代移动通信技术&#xff0c;正在全球范围内加速商用部署。与4G网络相比&#xff0c;5G在峰值速率、连接密度和时延等关键指标上实现了数量级提升。这种性能飞跃主要依赖于三项关键技术突破&#xff1a;Massive MIMO&#xff08;大规…...

ios蓝牙开发

一、蓝牙基本概念蓝牙&#xff1a;BLE (Bluetooth Low Energy/低功耗蓝牙)&#xff0c;一般应用苹果的官方框架基于 <CoreBluetooth/CoreBluetooth.h> 框架进行开发。中心设备&#xff1a;用于扫描周边蓝牙外设的设备&#xff0c;比如我们上面所说的中心者模式&#xff0…...

AI工作流编排利器:OpenClaw Workflow Kit 模块化设计与实战

1. 项目概述&#xff1a;一个为AI工作流打造的“瑞士军刀”最近在GitHub上看到一个挺有意思的项目&#xff0c;叫leilong611-ai/openclaw-workflow-kit。光看这个名字&#xff0c;你可能会有点懵&#xff1a;“OpenClaw”是啥&#xff1f;“Workflow Kit”又是干嘛的&#xff1…...

【AI 越强越离不开工具】:2026 年大模型开发者必备的工具链全景实战(附代码 + 架构图)

前言 目录 前言 一、核心悖论&#xff1a;为什么 AI 越强大&#xff0c;反而越依赖工具&#xff1f; 二、核心拆解&#xff1a;从 Tool 到 Skill 到 Agent&#xff0c;工具链的三层进化逻辑 三、2026 年 AI 工具链全景架构图 四、四大核心工具模块实战&#xff08;附可直…...

OpenClawWatch:本地优先的AI智能体监控工具,实现成本、安全与行为全链路追踪

1. 项目概述&#xff1a;为什么我们需要一个“本地优先”的AI智能体监控工具&#xff1f;如果你正在开发或运行能够自主执行任务的AI智能体&#xff0c;比如自动处理邮件、调用API、操作文件&#xff0c;甚至进行线上交易&#xff0c;那么你肯定经历过这样的焦虑时刻&#xff1…...

WinForm弹窗进阶:手把手教你封装一个通用的MessageBoxHelper工具类(.NET Framework/C#)

WinForm弹窗进阶&#xff1a;打造高复用性的MessageBoxHelper工具类 在WinForm开发中&#xff0c;MessageBox.Show()就像空气一样无处不在——从简单的操作确认到复杂的错误处理&#xff0c;这个基础组件承担了太多交互职责。但当你第20次写下MessageBox.Show("操作成功&q…...

保姆级教程:手把手教你用MuJoCo和Spinning Up让UR5机械臂学会‘指哪打哪’

从零实现UR5机械臂强化学习控制&#xff1a;MuJoCo与Spinning Up实战指南 看着实验室里崭新的UR5机械臂&#xff0c;你是否想过让它像人类手臂一样灵活地指向任意位置&#xff1f;传统控制方法需要复杂的运动学计算&#xff0c;而强化学习能让机械臂通过"试错"自主掌…...