我被要求为这个问题编写算法:我们给出了数组A,我们想知道数组中是否有任何两个元素U和L,其中U + L = K
我写了这样的算法:
while(first<last)
{
if(arr[first]+arr[last]==k)
return true
else if(arr[first]+arr[last]<k)
last=last-1;
else
first++;
}
return false
}
但问题是这个算法的运行时间是什么?是O(nlogn)吗?如果是,为什么?如果不是,我怎样才能在O(nlogn)中实现它?
答案 0 :(得分:1)
算法的运行时间为O(N)
,因为在最坏的情况下,您最终会迭代整个数组。
虽然你的算法无法解决问题。例如,考虑{9,1,3,4,2}
。在这种情况下,如果k
为12
,则返回false。对于您的算法,应首先对输入数组进行排序,然后将其传递给算法,在最坏的情况下将采用O(NlogN)
。
然而,更快的解决方案是使用类似HashMap
的内容来解决O(N)
时间内的问题。
答案 1 :(得分:1)
以下是python中alg的一个小例子,结果为false,但列表中有两个元素可以满足U + L = k
def testArray(a, k):
first = 0
last = len(a) - 1
while (first < last):
print first, last
if (a[first] + a[last] == k):
return True
elif (a[first] + a[last] < k):
last=last-1
else:
first=first+1
return False
a = [3, 1, 5, 3, 6]
print testArray(a, 6)