Для общего случая, когда может быть любое количество элементов, вот алгоритм O (q * log (q)), где q - размер списка ввода:
- Сортировка списка q в порядке возрастания.
- Удалите наименьший элемент m и добавьте его в набор результатов. Удалить его из q.
- Итерация по q. Держите список чисел, которые мы видели. Если мы видим число, которое есть (число, которое мы уже видели + m), то отбросим его. Это должно сохранить половину чисел (все те, которые не включают m).
- Повторяйте с шага 2, пока все числа не будут найдены.
Вот реализация этого алгоритма в Python:
def solve(q):
q = sorted(q)
x = []
while q:
x.append(q[0])
s = [False]*len(q)
s[0] = True
j = 1
for i in range(1, len(q)):
if q[i] == q[0] + q[j]:
s[i] = True
j += 1
while j < len(q) and s[j]:
j += 1
q = [k for k, v in zip(q, s) if not v]
return x
s = [1, 3, 7, 12, 13, 20, 25, 31, 32, 33, 62, 78, 80, 92, 99]
from itertools import combinations
q = list(sum(x) for r in range(1, len(s) + 1) for x in combinations(s, r))
print(solve(q))
Результат:
[1, 3, 7, 12, 13, 20, 25, 31, 32, 33, 62, 78, 80, 92, 99]
Оригинальный ответ:
Предполагая, что в списке только 3 числа и ни одно из них не может быть отрицательным:
Два числа должны быть наименьшими двумя числами в списке. Наибольшее число должно быть суммой всех трех. Вычитая вы можете найти третий номер.