Как найти другое целое число, суммирующее номер цели в списке в O (n)? [Дубликат]

1

Предположим, что у нас есть список 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).

Как это возможно?

Любой намек?

Теги:
algorithm

1 ответ

0

Да, это можно сделать в 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 хранить наборы индексов вместо одного.

  • 0
    если вы вложите свой [if target в lst] в цикл for, не так ли n ^ 2?
  • 0
    @Beverlie извини, я имел в виду, если цель в индексах
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню