哈希表经典算法题解析
454 四数相加 II
题目:给你四个整数数组 nums1、nums2、nums3 和 nums4,数组长度都是 n,请你计算有多少个元组 (i, j, k, l) 能满足:0 <= i, j, k, l < n 且 nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0。
示例 1: 输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2] 输出:2 解释:两个元组如下: (0, 0, 0, 1) -> 1 + (-2) + (-1) + 2 = 0 (1, 1, 0, 0) -> 2 + (-1) + (-1) + 0 = 0
题目链接:LeetCode
思路类似于两数之和,只不过这里涉及两个数组。使用 Map 存储前两个数组的和及其出现频率。
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer, Integer> map = new HashMap<>();
int result = 0;
for (int i : nums1) {
for (int j : nums2) {
int sum = i + j;
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
}
for (int i : nums3) {
for (int j : nums4) {
result += map.getOrDefault(0 - i - j, 0);
}
}
return result;
}
}
注意 map.getOrDefault 的用法:如果 key 存在则返回对应的 value,不存在就返回默认值 0。 map.put(sum, map.getOrDefault(sum, 0) + 1); 是统计频率的常见写法。
383 赎金信
题目:给你两个字符串 ransomNote 和 magazine,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true;否则返回 false。magazine 中的每个字符只能在 ransomNote 中使用一次。

