Я боролся с этими вопросами в течение некоторого времени. Вопрос звучит так: -
У нас есть n^2 чисел. Нам нужно выяснить, существует ли тройка a,b,c такая, что a+b+c = 0. В более общем случае a+b+c = k. (к дано)
Существует решение со сложностью O(n^2log(n)).
Любая помощь будет принята с благодарностью.
Благодарность
2 ответа
Чтобы получить это за O(n²logn), вам нужно отсортировать числа. Найдите все комбинации из 2 чисел и выполните двоичный поиск, чтобы найти третье.
Верхняя граница гораздо выше для общего варианта задачи.
Я написал грубое решение.
Это определенно можно сделать за O (n ^ 2). Вам не нужно сортировать это.
Это расширение задачи, которая требует суммирования двух чисел до x, и хитрость заключается в использовании хеш-таблицы.
def triplets(l, total):
"""Sum of 3 numbers to get to total
Basically an extension of the 2 table
"""
l = set( l)
d = { }
for i in l:
remain = total - i
inside = {}
for j in l:
if i == j:
continue
inside[j] = remain -j
d[i] = inside
good = set()
for first, dic in d.iteritems():
for second, third in dic.iteritems():
if third in l:
good.add( tuple(sorted([first, second, third])) )
for each in good:
print each
triplets( [2, 3, 4, 5, 6], 3+4+5)
ПРИМЕЧАНИЕ: мы можем использовать метод быстрой сортировки для троек, который будет равен O(1).
Похожие вопросы
Связанные вопросы
Новые вопросы
algorithm
Алгоритм - это последовательность четко определенных шагов, которые определяют абстрактное решение проблемы. Используйте этот тег, если ваша проблема связана с дизайном алгоритма.