Arrays 给定两个数组A&;B,找到两个数组中的第一个数字,这样替换它们会使数组A的和等于数组B的和

Arrays 给定两个数组A&;B,找到两个数组中的第一个数字,这样替换它们会使数组A的和等于数组B的和,arrays,algorithm,math,Arrays,Algorithm,Math,让我们考虑一下 A = [1,7,9,10] sumA = 27 B = [0,10,9,6] sumB = 25 从A和B中找出第一个元素(如果存在),如果我们用B[j]替换A[i]。sumA=sumB 这里,如果我们将1替换为0 sumA=sumB=26 我知道蛮力O(n2)解。但是需要一个更好的解决方案,比如O(n) 谢谢。O(nlogn)复杂性,O(n)内存解决方案: 给定初始数组A和B,sumA-sumB是交换元素差值的两倍。如果sumA-sumB为奇数,则没有解决方案。如果sum

让我们考虑一下

A = [1,7,9,10] sumA = 27
B = [0,10,9,6] sumB = 25
从A和B中找出第一个元素(如果存在),如果我们用B[j]替换A[i]。sumA=sumB

这里,如果我们将1替换为0

sumA=sumB=26
我知道蛮力O(n2)解。但是需要一个更好的解决方案,比如O(n)

谢谢。

O(nlogn)复杂性,O(n)内存解决方案:

给定初始数组
A
B
sumA-sumB
是交换元素差值的两倍。如果
sumA-sumB
为奇数,则没有解决方案。如果
sumA-sumB
是偶数(在本例中,它等于2),我们可以继续

现在在O(nlogn)时间内对两个数组进行排序(如果您不能在适当的位置进行排序,请在附近的某个位置构建排序的数组,从而O(n)内存)。一旦数组被排序,您可以在O(n)时间内同时扫描它们,保持不变:迭代器to
sortedB
始终指向一个元素,该元素至少小于
(sumA-sumB)/2
的值。根据需要向前驱动sortedA迭代器,bump
sortedB
迭代器-遍历有点类似于合并排序。一旦您在两个数组中找到了完全不同的
(sumA-sumB)/2
-停止遍历,返回到原始数组并找到这些值(及其索引)-这就是您的解决方案。如果遍历没有找到精确匹配,则没有解决方案

如果对初始数组进行排序,复杂性将降低到O(n)时间,O(1)内存。

是的,有一个
O(n)
解决方案涉及对其中一个数组的值进行哈希运算;因为对于每个元素,
a
,在数组
a
中,只有一个可能的元素,
b
,在数组
b
中可以解决以下问题:

sumA - a + b = sumB - b + a

2*b = sumB - sumA + 2*a

b = (sumB - sumA) / 2 + a

散列
O(n)
B
的值,对于
a
a
中的每个元素,在
O(1)
中确定值
(sumB-sumA)/2+a是否存在于
B

中,您的意思是“将
1
0
交换”?如果将
0
单独留在
B
中,则
B
的总和仍然是
25
。另外,您能否假定
A
B
已排序?(
B
在您的示例中没有排序。)“first”是什么意思?如果A[0]B[5]、A[5]B[0]和A[1]B[1]都是有效的替代品,你会如何排序,即哪一个是正确答案(以及原因)。因为如果不这样做,寻找匹配的数字(即,通过
(sumA sumB)/2
)需要O(n^2)@RoryDaulton注意OP没有提到语言,他在前面的问题中也没有提到
python
标记。另外,考虑到算法理论,列表和数组是不同的数据结构。此外,考虑到软件工程,无条件地对某些内容进行排序(特别是考虑到以后处理未修改数据的明确要求)是不可能的。