gpt4 book ai didi

c++ - 4个数组中4个整数的总和

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:09 24 4
gpt4 key购买 nike

给定四个整数值列表 A、B、C、D,计算有多少元组 (i、j、k、l) 满足 A[i] + B[j] + C[k] + D [l] 为零。

为了简化问题,所有 A、B、C、D 都具有相同的长度 N,其中 0 ≤ N ≤ 500。所有整数都在 -228 到 228 - 1 的范围内,结果保证为最多 231 - 1。

例子:

Input:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]

输出:2

解释:这两个元组是:

1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0

我刚刚想出了一个解决方案,将所有 vector 连接起来并找到 4 个总和。但我知道有更好的解决方案。有人会解释更好的解决方案吗?我只看到使用 O(N^2) 的代码,但我无法理解。

最佳答案

这是我的O(n^2) 解决方案:

int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
int n = A.size();
int result = 0;
unordered_map<int,int> sumMap1;
unordered_map<int,int> sumMap2;

for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
int sum1 = A[i] + B[j];
int sum2 = C[i] + D[j];
sumMap1[sum1]++;
sumMap2[sum2]++;
}
}
for(auto num1 : sumMap1) {
int number = num1.first;
if(sumMap2.find(-1 * number) != sumMap2.end()) {
result += num1.second * sumMap2[-1 * number];
}
}
return result;
}

核心观察是 - 如果 W + X + Y + Z = 0W + X = -(Y + Z)

在这里,我为 (A, B) 和 (C, D) 中的每个可能的和使用了两个哈希表来查找该和的出现次数。

然后,对于每个 sum(A, B),我们可以找到 sum(C, D) 是否包含可确保 sum(A, B) + sum(C, D) = 0。将 (sum(a, b) 的出现次数) * (免费 sum(c,d) 的出现次数) 添加到结果中。

创建 sum(A, B)sum(C, D) 将花费 O(n^2) 时间。计算元组的数量是 O(n^2) 因为每对有 n^2 总和(A-B, C-D).哈希表上的插入和搜索等其他操作均摊为 O(1)。因此,整体时间复杂度为 O(n^2)

关于c++ - 4个数组中4个整数的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com