1. 哈希表算法精讲:从四数之和到赎金信的全方位解析
哈希表作为算法面试中的常客,其高效查找特性使其成为解决各类统计、查找问题的利器。今天我将结合LeetCode经典题目,深入剖析哈希表在不同场景下的应用技巧,并分享我在刷题过程中总结的实战经验。
1.1 四数相加II的哈希分治策略
454题四数相加II是展示哈希表威力的典型案例。题目要求统计四个数组中满足a+b+c+d=0的元组数量,直接暴力枚举时间复杂度高达O(n⁴),显然不可行。
核心解法:采用分治思想,将问题拆解为两个两数之和问题:
- 先计算nums1和nums2所有元素和,存入哈希表记录各和出现次数
- 再计算nums3和nums4元素和的相反数,在哈希表中查找匹配
cpp复制int fourSumCount(vector<int>& nums1, vector<int>& nums2,
vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> sumMap;
int count = 0;
// 构建nums1+nums2的和频次表
for(int a : nums1)
for(int b : nums2)
sumMap[a+b]++;
// 查找nums3+nums4和的相反数
for(int c : nums3)
for(int d : nums4)
if(sumMap.count(-c-d))
count += sumMap[-c-d];
return count;
}
复杂度分析:
- 时间复杂度:O(n²) 两次双重循环
- 空间复杂度:O(n²) 最坏情况下所有和都不相同
关键技巧:当遇到多变量组合问题时,考虑能否通过分组降低维度。哈希表在此充当了高效的"记忆体",存储中间结果避免重复计算。
1.2 赎金信的字符统计艺术
383题赎金信要求判断杂志字符能否组成赎金信,是哈希表基础应用的典型场景。
解法对比:
- 哈希表
