我正在学习算法,而我正在阅读“算法第3版简介”一书,在问题部分则介绍了下一个问题:
描述一个O(n * log(n)) - 时间算法,给定一组n个整数和另一个整数x,确定S中是否存在两个元素,其和是x。
我不知道它是否提出并命令Set或无序Set?
答案 0 :(得分:2)
设x是你想要的总和。首先对数组进行排序。然后对于数组中的每个元素(a [i]),使用二分搜索找出数组中是否存在(x-a [i])。
伪代码:
sort(a,n)
for i : 1 to n
if(binary_search(a,i+1,n-1,x-a[i]))
return true
return false
其他方法: 排序后,首先使用两个指针并最后检查:
while(first < last) {
if(a[first]+a[last] == x) return true;
else if(a[first]+a[last] < x) first++;
else if(a[first]+a[last] > x) last--;
}
return false;
答案 1 :(得分:0)
给定一个排序数组,你可以找到是否有一对与O(n)算术运算相加的x。
i := 0
j := len(A) - 1
while i < j {
if A[i] + A[j] < x {
i += 1
} else if A[i] + A[j] == x {
return true
} else if A[i] + A[j] > x {
j -= 1
}
}
return false
鉴于此,您可以通过对数组进行排序,然后使用上述算法,确定是否有任何数组包含一对使用O(n log n)算术运算求和为x的元素。