news 2026/3/21 8:13:01

【算法题】哈希

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【算法题】哈希

哈希表(哈希映射/哈希集合)是算法中解决“查找、统计、匹配”类问题的核心工具,核心优势是平均O(1)时间复杂度的增删查操作。它通过“键值对”的映射关系,将原本需要线性遍历的查找操作优化为常数级,广泛应用于两数之和、字符统计、重复元素判断、异位词分组等场景。本文通过5道经典题目,拆解哈希表在不同场景下的解题思路与代码实现。

一、两数之和

题目描述:
给定整数数组nums和目标值target,找出数组中两个数的索引,使它们的和等于target(假设每种输入只有一个答案,且不能使用同一个元素两次)。

示例

  • 输入:nums = [2,7,11,15], target = 9,输出:[0,1]

解题思路:
用哈希表存储“数值→索引”的映射,遍历数组时反向查找

  1. 遍历数组,对当前元素nums[i],计算需要匹配的数值x = target - nums[i]
  2. x存在于哈希表中,说明已遍历过该数值,直接返回[hash[x], i]
  3. 若不存在,将当前数值和索引存入哈希表,继续遍历。

完整代码:

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

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),遍历数组一次,哈希表的查/存操作均为O(1)O(1)O(1)
  • 空间复杂度:O(n)O(n)O(n),哈希表最多存储n-1个元素。

二、判定是否互为字符重排

题目描述:
给定两个字符串s1s2,判断是否为彼此的字符重排(字符种类和数量完全相同,仅顺序不同)。

示例

  • 输入:s1 = "abc", s2 = "bca",输出:true
  • 输入:s1 = "abc", s2 = "abd",输出:false

解题思路:
用固定长度的数组模拟哈希表(字符集仅小写字母),统计字符频次:

  1. 若两字符串长度不同,直接返回false
  2. 遍历s1,统计每个字符的出现次数。
  3. 遍历s2,减少对应字符的频次,若出现频次为负(字符数量不匹配),返回false

完整代码:

classSolution{public:boolCheckPermutation(string s1,string s2){if(s1.size()!=s2.size())returnfalse;inthash[26]={0};for(autoc:s1)hash[c-'a']++;for(autoc:s2)if(--hash[c-'a']<0)returnfalse;returntrue;}};

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n)n为字符串长度,遍历两次字符串。
  • 空间复杂度:O(1)O(1)O(1),数组长度固定为26(仅存储小写字母频次)。

三、存在重复元素

题目描述:
给定整数数组nums,判断是否存在重复元素(任意一个元素出现至少两次)。

示例

  • 输入:nums = [1,2,3,1],输出:true
  • 输入:nums = [1,2,3,4],输出:false

解题思路:
用哈希集合存储已遍历的元素,遍历过程中实时查重

  1. 遍历数组,若当前元素已在哈希集合中,说明存在重复,返回true
  2. 若不存在,将元素插入集合,继续遍历。
  3. 遍历结束后未找到重复元素,返回false

完整代码:

classSolution{public:boolcontainsDuplicate(vector<int>&nums){unordered_set<int>hash;for(auton:nums){if(hash.count(n))returntrue;elsehash.insert(n);}returnfalse;}};

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),遍历数组一次,集合的查/插操作均为O(1)O(1)O(1)
  • 空间复杂度:O(n)O(n)O(n),集合最多存储n个元素。

四、存在重复元素 II

题目描述:
给定整数数组nums和整数k,判断是否存在两个不同的索引ij,使得nums[i] = nums[j]abs(i - j) ≤ k

示例

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

解题思路:
用哈希表存储“数值→最新索引”的映射,遍历过程中检查索引差

  1. 遍历数组,若当前数值已存在于哈希表中,计算索引差abs(i - hash[nums[i]])
  2. 若索引差 ≤k,返回true;否则更新哈希表中该数值的索引为当前索引。
  3. 若数值不存在,直接存入哈希表。

完整代码:

classSolution{public:boolcontainsNearbyDuplicate(vector<int>&nums,intk){unordered_map<int,int>hash;for(inti=0;i<nums.size();i++){if(hash.count(nums[i]))if(abs(i-hash[nums[i]])<=k)returntrue;hash[nums[i]]=i;}returnfalse;}};

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),遍历数组一次,哈希表操作均为O(1)O(1)O(1)
  • 空间复杂度:O(n)O(n)O(n),哈希表最多存储n个元素。

五、字母异位词分组

题目描述:
给定字符串数组strs,将字母异位词组合在一起(字母异位词指字母相同但排列不同的字符串)。

示例

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

解题思路:
将“排序后的字符串”作为哈希表的键,分组存储异位词

  1. 遍历每个字符串,将其排序后得到“基准键”(异位词排序后结果相同)。
  2. 将原字符串存入哈希表中对应键的列表里。
  3. 遍历哈希表,收集所有列表作为结果。

完整代码:

classSolution{public:vector<vector<string>>groupAnagrams(vector<string>&strs){unordered_map<string,vector<string>>hash;for(auto&s:strs){string tmp=s;sort(tmp.begin(),tmp.end());hash[tmp].push_back(s);}vector<vector<string>>ret;for(auto&[x,y]:hash){ret.push_back(y);}returnret;}};

复杂度分析:

  • 时间复杂度:O(nklog⁡k)O(nk \log k)O(nklogk)n是字符串数量,k是字符串最大长度(排序每个字符串需O(klog⁡k)O(k \log k)O(klogk))。
  • 空间复杂度:O(nk)O(nk)O(nk),哈希表存储所有字符串(必要输出,不计入额外复杂度)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/17 6:45:39

零代码部署中文文本匹配系统|GTE大模型CPU版镜像全攻略

零代码部署中文文本匹配系统&#xff5c;GTE大模型CPU版镜像全攻略 1. 项目背景与核心价值 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;语义相似度计算是构建智能问答、推荐系统、文本去重等应用的核心能力之一。传统方法依赖关键词匹配或规则引擎&#xff0…

作者头像 李华
网站建设 2026/3/15 17:29:11

Hunyuan大模型企业部署:私有云环境安全策略配置

Hunyuan大模型企业部署&#xff1a;私有云环境安全策略配置 1. 引言 1.1 业务场景描述 随着全球化进程的加速&#xff0c;企业对高质量、低延迟、高安全性的机器翻译服务需求日益增长。尤其在金融、医疗、法律等敏感行业&#xff0c;数据隐私和合规性成为技术选型的核心考量…

作者头像 李华
网站建设 2026/3/15 17:29:05

Windows用户如何轻松读取Linux磁盘:Ext2Read全攻略

Windows用户如何轻松读取Linux磁盘&#xff1a;Ext2Read全攻略 【免费下载链接】ext2read A Windows Application to read and copy Ext2/Ext3/Ext4 (With LVM) Partitions from Windows. 项目地址: https://gitcode.com/gh_mirrors/ex/ext2read 你是否曾经遇到过这样的…

作者头像 李华
网站建设 2026/3/15 8:02:47

IndexTTS-2-LLM实战:游戏NPC语音生成系统开发

IndexTTS-2-LLM实战&#xff1a;游戏NPC语音生成系统开发 1. 引言 随着人工智能技术的不断演进&#xff0c;语音合成&#xff08;Text-to-Speech, TTS&#xff09;在游戏、虚拟助手、有声内容创作等场景中扮演着越来越重要的角色。传统TTS系统虽然能够实现基本的文本转语音功…

作者头像 李华
网站建设 2026/3/15 16:44:49

MacGesture:重新定义macOS鼠标操作效率的终极解决方案

MacGesture&#xff1a;重新定义macOS鼠标操作效率的终极解决方案 【免费下载链接】MacGesture Global mouse gestures for macOS 项目地址: https://gitcode.com/gh_mirrors/ma/MacGesture 你是否曾经因为频繁切换浏览器标签而感到手指酸痛&#xff1f;是否厌倦了记忆复…

作者头像 李华
网站建设 2026/3/15 21:28:56

解锁Windows系统最佳B站体验:Bili.Uwp客户端深度解析

解锁Windows系统最佳B站体验&#xff1a;Bili.Uwp客户端深度解析 【免费下载链接】Bili.Uwp 适用于新系统UI的哔哩 项目地址: https://gitcode.com/GitHub_Trending/bi/Bili.Uwp 还在为浏览器看B站卡顿、功能受限而烦恼吗&#xff1f;作为Windows平台用户&#xff0c;你…

作者头像 李华