四数相加 II

LeetCode每日一题,454. 4Sum II

先看题目描述

DDnaCD.png

大意就是给定四个数组 A,B,C 和 D,问存在的四元组 (i,j,k,l) 使得 A[i] + B[j] + C[k] + D[l] = 0 的数量

算法和思路

分组+哈希表

将四个数组分成两部分,A 和 B 分为一组,C 和 D 分为另外一组

对于 A 和 B,使用二重循环对它们进行遍历,得到所有 A[i] + B[j] 的值并存入哈希表中,对于哈希表中的每个键值对,键 A[i] + B[j] 对应的值就是 A[i] + B[j] 出现的次数

对于 C 和 D,同样使用二重循环对它们进行遍历。当遍历到 C[k] + D[l] 时,若哈希表的键中存在 -C[k] - D[l],则将其对应的值累加到答案上,最后即可得到满足 A[i] + B[j] + C[k] + D[l] = 0 的四元组的数量

算法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.*;

class Solution {
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
Map<Integer, Integer> map = new HashMap<>();
int ans = 0;
for (int u : A) {
for (int v : B) {
map.put(u + v, map.getOrDefault(u + v, 0) + 1);
}
}
for (int u : C) {
for (int v : D) {
if (map.containsKey(-u - v)) {
ans += map.get(-u - v);
}
}
}
return ans;
}
}