Предположим, что у нас есть список A
который содержит в нем целые числа.
A = [2,4,5,6,7]
Тогда заданное целое число t
t = 6
Я хотел бы найти индексный набор из двух элементов, который делает t
суммированием.
return [0,1]
Я использовал свой питон и закодировал, как показано ниже:
def myMethod(A,t):
for i in range(len(A)):
for j in range(i,len(A)):
if A[i] + A[j] == target:
return([i,j])
Это работает, но кто-то сказал мне, что лучший метод требует только усреднения O (n).
Как это возможно?
Любой намек?
Да, это можно сделать в O (n). Хитрость заключается в том, чтобы сохранить инвертированный индекс, где каждый номер находится в списке.
Как только это будет сделано, вы можете пересечь список и посмотреть, находится ли разница между запрошенной суммой и текущим элементом в списке, и если да, то где. Поскольку dict
использует хеши для поиска, этот последний шаг выполняется в O (1).
def find_sum(s, lst):
indices = {x: i for i, x in enumerate(lst)}
for i, x in enumerate(lst):
target = s - x
if target in indices:
return (i, indices[target])
return None
lst = [2, 4, 5, 6, 7]
print(find_sum(6, lst)) # (0, 1)
Это решение может быть адаптировано для возврата всех таких пар, заставляя indices
хранить наборы индексов вместо одного.