Раствор в O (n 2 log n):
Вычисляет наборы всех возможных сумм и разниц:
{a i + a j : 1 <= i, j <= n} </p>
{a i -a j : 1 <= i, j <= n} </p>
(сохранить их в сбалансированном бинарном дереве поиска) и проверить, имеют ли они общий элемент. Если да, существуют i, j, k, l такие, что a i + a j = a k - a l , это i + a j + a l = a k .
Решение в O (a n log a n ), где a n - наибольшее число в векторе:
Вычислить полином
(x a 1 + x a 2 + ... + x a n ) 3
Вы можете сделать это в O (a n log a n ), используя Быстрое преобразование Фурье (сначала вычислите квадрат, затем третью степень; см. * 1069) * здесь для описания). Заметьте, что после умножения коэффициент x b i был сформирован из умножения x a i * x a j * x a k = x a i + a j + a k для некоторых i, j, k. Проверьте, есть ли степень x a l в полученном полиноме.
К сожалению, это позволяет использовать некоторые i, j, k дважды. Вычитание 3 (x 2a 1 + ... + x 2a n ) * (x a 1 + ... + x a n ) - 2 (x 3a 1 + ... + x 3a n ) удалит эти x a i + a j + a k .