#algorithm
#алгоритм
Вопрос:
Учитывая отсортированный массив a[0…n-1], найдите все пары чисел, сумма которых меньше S. Существует ли O (n) решение?
Комментарии:
1. Учитывая, что вы работаете строго с парами чисел, да.
2. У вас есть три точки
...
, которые также вычитаются1
изn
. Вы уверены, что вам нужны оба? Что такоеnos
?3. Джерри: Но в списке есть O (n ^ 2) пар.
Ответ №1:
Вы сейчас на собеседовании? Они скоро вернутся в комнату?
Поскольку все отсортировано, то одно из решений (если таковое имеется!) равно [0] и некоторым наибольшим [M]. Затем увеличьте нижний индекс от 0, а верхний индекс — от M. И некоторые подробности о том, какие из них использовать, а когда отклонить.
Редактировать — поскольку все еще может существовать O (n ^ 2) решений (например, если S более чем в два раза больше самой большой записи), хитрость будет заключаться в том, чтобы выразить решения в виде диапазонов. В противном случае простое перечисление займет слишком много времени.
Комментарии:
1. M не упоминается в вопросе, но предполагая, что это так
n-1
, утверждение «одно из решений (если таковое имеется!) равно [0] и [M]» неверно. Наиболее вероятным решением являются [0] и [1], которые легко могут находиться в диапазоне, в то время как [0] и [M] >= S. Диапазоны — отличная идея.
Ответ №2:
Это может помочь:
Ответ №3:
Решение Дэвида должно сработать. Это будет O (N), даже если существует более N решений.
1) Начните с *ptr1 = a [0] и *ptr2 = a [X] <= S (X не всегда N-1)
2) Перемещайте ptr2 назад до тех пор, пока ptr1 ptr2 <= S.
— на данный момент ptr1 все индексы вплоть до ptr2 являются решениями.
3) Переместите ptr2 на один индекс назад, а ptr1 — на один индекс вверх
— повторить
Продолжайте, пока ptr1 > ptr2
Ответ №4:
Перечисление всех таких пар уже выполняется в O (n ^ 2) (обратите внимание, что это отличается от задачи суммирования ровно до S, поскольку в этом случае перечисление может быть выполнено в O (n), например «3 раза по паре (w, x), 1 раз по паре (y, z), …»
Ответ №5:
Решения O (n) не существует. Например, если у вас есть список, подобный этому: 1,2,3,4 … n и S = 3 * n, то сумма каждой пары меньше S. И количество пар, которые должны быть возвращены, равно n * (n-1)/2.