Я не думаю, что это возможно в o(n²)
(т. Е. Действительно лучше , чем n²
), но это можно сделать в O(n²)
(т. Е. Как n²
) следующим образом:
Прежде всего, обратный список B
, чтобы получить B'
(занимает O(n)
время), список, элементы которого отсортированы в порядке убывания.Сначала рассмотрим проблему нахождения двух элементов в списках A
и B'
, которые суммируются с любым заданным числом:
Мы можем сделать это следующим образом (код Python):
def getIndicesFromTwoArrays(A,B,t):
a,b=0,0
while(A[a]+B[b]!=t):
b=b+1
if b==len(B):
return (-1,-1)
if A[a]+B[b]<t:
a=a+1
b=b-1
if a==len(A):
return (-1,-1)
return (a,b)
Время выполнения вышеперечисленного составляет O(n)
.Требуемое дополнительное пространство составляет O(1)
, поскольку нам нужно хранить только два указателя.Обратите внимание, что вышеприведенное можно легко преобразовать так, чтобы оно работало с двусвязными списками.
Тогда, в общем, нам просто нужно сделать следующее:
def test(A,B,C):
B.reverse()
for c in C:
if getIndicesFromTwoArrays(A, B, c) != (-1,-1):
return True
return False
Это приводит к продолжительности работы O(n²)
и дополнительное пространство O(1)
.