让我们考虑一下
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)。
感谢。
答案 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)内存解决方案:
鉴于初始数组A
和B
,sumA-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)内存。