写一个O(n lg n)算法,该算法接收n个实数数组A(以非降序排序)和值val作为输入。如果索引i和j的值不同,则算法返回true,则a [i] + a [j] = val,否则返回false。
我发现了以下伪代码,但意识到它仅适用于相邻元素
checkArray(Array A, val)
if A.length==2
if A[0] + A[1] =val
return true;
else
return false
else
L1 = checkArray (A[0 : n/2],val)
L2 = checkArray(A[n/2 : n], val)
答案 0 :(得分:3)
注释中的提示几乎放弃了O(nlogn)
对每个元素a[i]
的回答,并对数组进行二进制搜索以查看val - a[i]
是否存在。由于它看起来相当简单,因此我将不进一步介绍该算法。相反,我想对O(n)
解决方案有所启发,但这可能并不那么明显。
简而言之,O(n)
使用两个指针,它们将从末端到中间一直工作,并不断检查两个指针的总和是否等于val
。如果它们的总和大于val
,我们通过将其指针向左移动一个来减小两个指针中的较大者(最右边的指针)。如果其较小,则通过向右移动其指针来增大两者中的较小者。如果两个指针相互传递,则说明不存在解决方案。
checkArray(Array A, val)
indexLo = 0
indexHi = len(A) - 1
while indexLo <= indexHi
sum = A[indexLo] + A[indexHi]
if sum == val
return True
if sum < val
indexLo += 1
else
indexHi -= 1
return False