Взято из введения в алгоритмы
Опишите алгоритм Θ (n lg n) -time что при множестве S из n целых чисел и другое целое число х, определяет, или нет, существуют два элемента в S чья сумма равна х.
Это мое лучшее решение, реализованное в 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), поэтому он должен быть правильным.
Мой второй вопрос: есть ли лучшие решения? Является ли сортировка существенной?