确定集合 S 中是否存在两个元素,其总和正好是 x - 正确的解?
摘自《算法导论》
描述一个 Θ(n lg n)时间算法,该算法给定一组 n 个整数和另一个整数 x 的集合 S,确定 S 中是否存在两个总和正好为 x 的元素。
这是我迄今为止在Java中实现的最佳解决方案:
public static boolean test(int[] a, int val) {
mergeSort(a);
for (int i = 0; i < a.length - 1; ++i) {
int diff = (val >= a[i]) ? val - a[i] : a[i] - val;
if (Arrays.binarySearch(a, i, a.length, diff) >= 0) {
return true;
}
}
return false;
}
现在我的第一个问题是:这是一个正确的解决方案吗?根据我的理解,mergeSort应该在O(n lg n)中执行排序,循环应该采用O(n lg n)(n用于迭代乘以O(lg n)进行二进制搜索,从而产生O(2n lg n),因此它应该是正确的。
我的第二个问题是:有没有更好的解决方案?对数组进行排序是否至关重要?