Есть массив чисел int[] input. Натуральные, в произвольном порядке, количество чисел - N.
Есть число int K, равное константе.
Найти в input все такие пары, суммы которых равны K.
Пример:
int input[] = {5,1,8,6,9,2,44,3,31,26,36,47,51,72,88,7,4};
int K = 10;
Говорят есть алгоритм ценой O(n).
Пока есть такой алгоритм - составить битовую карту или map всех чисел, или другой объект, у которого можно быстро спрашивать «есть ли такое число».
Затем проходя по всем числам и вычитая их из K (находя второе слагаемое), проверять - есть ли такое слагаемое вообще (это либо O(1) для битовой карты, либо O(log(n)) для дерева бинарного.
То есть имеющийся алгоритм жрёт O(n*log(n)) времени, а есть какой-то O(n).
Может быть входной массив отсортировать (один раз затратив O(n*log(n)) ), далее идти двумя указателями с конца и с начала. Можно с этим что-то придумать?