鉴于两个阵列A& B,找到两个数组中的第一个数字,以便替换它们使得数组A的总和等于数组B的总和

时间:2017-06-16 13:50:05

标签: 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

这里,如果我们用0替换1。

sumA=sumB=26

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

感谢。

2 个答案:

答案 0 :(得分:1)

是的,有一个O(n)解决方案涉及散列其中一个数组的值;因为对于数组a中的每个元素A,数组b中只有一个可能的元素B可以解决这个问题:

sumA - a + b = sumB - b + a

2*b = sumB - sumA + 2*a

b = (sumB - sumA) / 2 + a

B中散布O(n)的值,并在a中为每个元素A散列,在O(1)中确定值(sumB - sumA) / 2 + a }存在于B

答案 1 :(得分:0)

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

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

现在对两个数组进行排序(如果你不能就地进行排序,在附近某处构建排序数组,因此 O(n)内存 O(nlogn)< / strong>时间。对数组进行排序后,您可以在 O(n)时间内同时扫描它们,保持不变量:sortedB的迭代器始终指向至少为{{{}的元素1}}小于(sumA-sumB)/2迭代器。驱动sortedA迭代器向前,根据需要碰撞sortedA迭代器 - 遍历有点类似于合并排序。一旦在两个完全不同sortedB的数组中找到值 - 停止遍历,回退到原始数组并找到这些值(及其索引) - 这是您的解决方案。如果遍历找不到完全匹配 - 则没有解决方案。

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