终极 ChatGPT-Google 扩展日志分析指南:深度洞察用户行为与功能使用统计 [特殊字符]
2026/5/15 4:53:11
哈希表(哈希映射/哈希集合)是算法中解决“查找、统计、匹配”类问题的核心工具,核心优势是平均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: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};}};复杂度分析:
n-1个元素。题目描述:
给定两个字符串s1和s2,判断是否为彼此的字符重排(字符种类和数量完全相同,仅顺序不同)。
示例:
s1 = "abc", s2 = "bca",输出:trues1 = "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;}};复杂度分析:
n为字符串长度,遍历两次字符串。题目描述:
给定整数数组nums,判断是否存在重复元素(任意一个元素出现至少两次)。
示例:
nums = [1,2,3,1],输出:truenums = [1,2,3,4],输出:false解题思路:
用哈希集合存储已遍历的元素,遍历过程中实时查重:
true。false。完整代码:
classSolution{public:boolcontainsDuplicate(vector<int>&nums){unordered_set<int>hash;for(auton:nums){if(hash.count(n))returntrue;elsehash.insert(n);}returnfalse;}};复杂度分析:
n个元素。题目描述:
给定整数数组nums和整数k,判断是否存在两个不同的索引i和j,使得nums[i] = nums[j]且abs(i - j) ≤ k。
示例:
nums = [1,2,3,1], k = 3,输出:truenums = [1,2,3,1,2,3], k = 2,输出:false解题思路:
用哈希表存储“数值→最新索引”的映射,遍历过程中检查索引差:
abs(i - hash[nums[i]])。k,返回true;否则更新哈希表中该数值的索引为当前索引。完整代码:
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;}};复杂度分析:
n个元素。题目描述:
给定字符串数组strs,将字母异位词组合在一起(字母异位词指字母相同但排列不同的字符串)。
示例:
strs = ["eat","tea","tan","ate","nat","bat"],输出:[["eat","tea","ate"],["tan","nat"],["bat"]]解题思路:
将“排序后的字符串”作为哈希表的键,分组存储异位词:
完整代码:
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;}};复杂度分析:
n是字符串数量,k是字符串最大长度(排序每个字符串需O(klogk)O(k \log k)O(klogk))。