Это можно сделать в O (1) пространстве и O (N 2 ) времени.
Сначала давайте решим более простую задачу:
Учитывая два массива A
и B
, выбираем по одному элементу из каждого, чтобы их сумма равнялась данному числу K
.
Сортировка обоих массивов, которая занимает O (NlogN).
Возьмите указатели i
и j
, чтобы i
указывал на начало массива A
, а j
указывал на конец B
.
Найдите сумму A[i] + B[j]
и сравните ее с K
- если
A[i] + B[j] == K
мы нашли
пара A[i]
и B[j]
- если
A[i] + B[j] < K
, нам нужно
увеличить сумму, поэтому приращение i
.
- если
A[i] + B[j] > K
, нам нужно
уменьшить сумму, чтобы уменьшить j
.
Этот процесс поиска пары после сортировки занимает O (N).
Теперь давайте возьмем исходную задачу. У нас есть третий массив, теперь назовите его C
.
Итак, алгоритм теперь такой:
foreach element x in C
find a pair A[i], B[j] from A and B such that A[i] + B[j] = K - x
end for
Внешний цикл запускается N
раз, и для каждого запуска мы выполняем операцию O (N), делая весь алгоритм O (N 2 ).