2026/4/16 1:26:25
网站建设
项目流程
网站总是跳转dede58,个人做旅游网站怎样,性价比最高网站建设价格,电商网站详细设计哈希表#xff08;哈希映射/哈希集合#xff09;是算法中解决“查找、统计、匹配”类问题的核心工具#xff0c;核心优势是平均O(1)时间复杂度的增删查操作。它通过“键值对”的映射关系#xff0c;将原本需要线性遍历的查找操作优化为常数级#xff0c;广泛应用于两数之和…哈希表哈希映射/哈希集合是算法中解决“查找、统计、匹配”类问题的核心工具核心优势是平均O(1)时间复杂度的增删查操作。它通过“键值对”的映射关系将原本需要线性遍历的查找操作优化为常数级广泛应用于两数之和、字符统计、重复元素判断、异位词分组等场景。本文通过5道经典题目拆解哈希表在不同场景下的解题思路与代码实现。一、两数之和题目描述给定整数数组nums和目标值target找出数组中两个数的索引使它们的和等于target假设每种输入只有一个答案且不能使用同一个元素两次。示例输入nums [2,7,11,15], target 9输出[0,1]解题思路用哈希表存储“数值→索引”的映射遍历数组时反向查找遍历数组对当前元素nums[i]计算需要匹配的数值x target - nums[i]。若x存在于哈希表中说明已遍历过该数值直接返回[hash[x], i]。若不存在将当前数值和索引存入哈希表继续遍历。完整代码classSolution{public:vectorinttwoSum(vectorintnums,inttarget){unordered_mapint,inthash;for(inti0;inums.size();i){intxtarget-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个元素。二、判定是否互为字符重排题目描述给定两个字符串s1和s2判断是否为彼此的字符重排字符种类和数量完全相同仅顺序不同。示例输入s1 abc, s2 bca输出true输入s1 abc, s2 abd输出false解题思路用固定长度的数组模拟哈希表字符集仅小写字母统计字符频次若两字符串长度不同直接返回false。遍历s1统计每个字符的出现次数。遍历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解题思路用哈希集合存储已遍历的元素遍历过程中实时查重遍历数组若当前元素已在哈希集合中说明存在重复返回true。若不存在将元素插入集合继续遍历。遍历结束后未找到重复元素返回false。完整代码classSolution{public:boolcontainsDuplicate(vectorintnums){unordered_setinthash;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判断是否存在两个不同的索引i和j使得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解题思路用哈希表存储“数值→最新索引”的映射遍历过程中检查索引差遍历数组若当前数值已存在于哈希表中计算索引差abs(i - hash[nums[i]])。若索引差 ≤k返回true否则更新哈希表中该数值的索引为当前索引。若数值不存在直接存入哈希表。完整代码classSolution{public:boolcontainsNearbyDuplicate(vectorintnums,intk){unordered_mapint,inthash;for(inti0;inums.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]]解题思路将“排序后的字符串”作为哈希表的键分组存储异位词遍历每个字符串将其排序后得到“基准键”异位词排序后结果相同。将原字符串存入哈希表中对应键的列表里。遍历哈希表收集所有列表作为结果。完整代码classSolution{public:vectorvectorstringgroupAnagrams(vectorstringstrs){unordered_mapstring,vectorstringhash;for(autos:strs){string tmps;sort(tmp.begin(),tmp.end());hash[tmp].push_back(s);}vectorvectorstringret;for(auto[x,y]:hash){ret.push_back(y);}returnret;}};复杂度分析时间复杂度O(nklogk)O(nk \log k)O(nklogk)n是字符串数量k是字符串最大长度排序每个字符串需O(klogk)O(k \log k)O(klogk)。空间复杂度O(nk)O(nk)O(nk)哈希表存储所有字符串必要输出不计入额外复杂度。