哈希表算法实战
哈希表的核心价值在于快速查找。在处理数组求和或字符匹配问题时,合理选择数据结构往往能显著降低时间复杂度。下面结合四个经典题目,梳理 Java 中的实现细节与避坑指南。
四数相加 II
问题描述 给定四个整数数组 nums1、nums2、nums3、nums4,计算有多少个元组 (i, j, k, l) 满足 nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0。
思路解析 这题可以看作两数之和的扩展。暴力解法是 O(n^4),利用哈希表可以将复杂度降为 O(n^2)。核心策略是将前两个数组的和存入 Map,统计每个和出现的次数;再遍历后两个数组,在 Map 中查找是否存在相反数。
import java.util.*;
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer, Integer> map = new HashMap<>();
// 统计 nums1 和 nums2 中所有两数之和的频率
for (int i : nums1) {
for (int j : nums2) {
int sum = i + j;
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
}
int result = 0;
// 遍历 nums3 和 nums4,查找互补值
for (int i : nums3) {
for (int j : nums4) {
result += map.getOrDefault(0 - i - j, 0);
}
}
return result;
}
}
注意点
map.getOrDefault(key, 0) 是处理缺失 key 的常用写法,避免空指针异常。统计频率时 put(sum, getOrDefault(sum, 0) + 1) 比先判断再 put 更简洁。

