news 2026/1/15 3:33:12

【算法题】哈希

作者头像

张小明

前端开发工程师

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/1/15 3:33:05

AI脚本效率提升:重构设计师工作流程的智能革命

AI脚本效率提升&#xff1a;重构设计师工作流程的智能革命 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否曾计算过在Illustrator中重复点击菜单的时间成本&#xff1f;当创意…

作者头像 李华
网站建设 2026/1/15 3:32:57

小白也能懂:用GLM-ASR-Nano-2512实现会议录音自动转文字

小白也能懂&#xff1a;用GLM-ASR-Nano-2512实现会议录音自动转文字 1. 引言&#xff1a;为什么你需要一个本地语音识别方案&#xff1f; 在日常工作中&#xff0c;会议、讲座、访谈等场景产生的音频内容越来越多。如何高效地将这些语音信息转化为可编辑、可搜索的文字&#…

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

如何快速掌握缠论分析:通达信插件的完整使用指南

如何快速掌握缠论分析&#xff1a;通达信插件的完整使用指南 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 缠论作为技术分析领域的重要理论&#xff0c;其复杂的分型、笔、线段识别往往让投资者望而却…

作者头像 李华
网站建设 2026/1/15 3:32:04

Qwen1.5-0.5B显存不足?FP32精度优化部署案例解析

Qwen1.5-0.5B显存不足&#xff1f;FP32精度优化部署案例解析 1. 引言&#xff1a;轻量级大模型在边缘场景的挑战与机遇 随着大语言模型&#xff08;LLM&#xff09;能力的不断提升&#xff0c;如何在资源受限的设备上实现高效推理成为工程落地的关键瓶颈。尤其在边缘计算或无…

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

如何快速上手libdxfrw:DXF文件处理的完整指南

如何快速上手libdxfrw&#xff1a;DXF文件处理的完整指南 【免费下载链接】libdxfrw C library to read and write DXF/DWG files 项目地址: https://gitcode.com/gh_mirrors/li/libdxfrw 如果你正在寻找一个简单高效的DXF文件读写解决方案&#xff0c;libdxfrw可能是你…

作者头像 李华
网站建设 2026/1/15 3:31:19

用CV-UNet做了个电商抠图项目,全过程分享超实用

用CV-UNet做了个电商抠图项目&#xff0c;全过程分享超实用 1. 项目背景与业务需求 在电商平台的日常运营中&#xff0c;商品主图的质量直接影响点击率和转化率。一个常见的核心需求是&#xff1a;将拍摄的商品照片从原始背景中精准分离&#xff0c;生成透明底PNG图像&#x…

作者头像 李华