提供一种以O(nlogn)执行的算法来解决以下问题

时间:2019-03-11 05:49:35

标签: algorithm analysis

写一个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)

1 个答案:

答案 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
相关问题