给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。
例如:
输入: A = [ 1, 2] B = [-2,-1] C = [-1, 2] D = [ 0, 2]
输出: 2
解释: 两个元组如下:
思路:建立一个哈希映射,一个记录AB数组的组合和,和为key,出现的次数为value 计算CD数组的组合和,得到相反数,若该数存在于key中,即符合要求,将答案加上AB组合和中该数出现的次数(value)
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
int num = 0,temp=0;
map<int, int> sum_map;
for (auto a : A) {
for (auto b : B) {
if (sum_map.count(a + b) == 0) sum_map[a + b] = 1;
else
++sum_map[a + b];
}
}
for (auto c : C) {
for (auto d : D) {
temp = -(c + d);
if (sum_map.count(temp)) num+=sum_map[temp];
}
}
return num;
}执行用时 :492 ms, 在所有 C++ 提交中击败了42.54%的用户
内存消耗 :29.3 MB, 在所有 C++ 提交中击败了57.21%的用户
int num = 0,temp=0;
unordered_map<int, int> sum_map;
for (auto a : A) {
for (auto b : B) {
if (sum_map.count(a + b) == 0) sum_map[a + b] = 1;
else
++sum_map[a + b];
}
}
for (auto c : C) {
for (auto d : D) {
temp = -(c + d);
if (sum_map.count(temp)) num+=sum_map[temp];
}
}
return num;执行用时 :1822 ms, 在所有 C++ 提交中击败了98.56%的用户
内存消耗 :28.4 MB, 在所有 C++ 提交中击败了57.21%的用户