Я бы использовал бинарный поиск. Вам нужно найти либо первый элемент, который больше b
, либо последний элемент, который меньше b
. Скажем, мы нашли индекс первого элемента, который больше с бинарным поиском с некоторым индексом j
. Тогда наш ответ - b [j - 1], b [j] и т. Д. Для других случаев. Это работает в O (logN) времени.
import bisect
def find(a, b):
n, j = len(a), bisect.bisect_left(a, b)
if a[j] > b:
return (None if j == 0 else a[j-1]), a[j]
else:
return a[j], (None if j >= n - 1 else a[j + 1])
if __name__ == '__main__':
a = [4,5,6,8,9,15,16,18,54,60]
b = 24
print find(a, 24)
print find(a, 3)
print find(a, 4)
print find(a, 7)
print find(a, 60)
Более короткий подход:
import bisect
def find(a, b):
n, j = len(a), bisect.bisect_left(a, b)
return ((None if j == 0 else a[j-1]), a[j]) if a[j] > b else (a[j], (None if j >= n - 1 else a[j + 1]))
Важно: массив должен быть отсортирован
К сожалению, у меня нет вашего вопроса. Если вы посмотрите на массив, вы увидите, что он отсортирован и что 18 является первым наименьшим, а 54 - первым. –
Ну, я не думаю, что это то, что я хотел ... –
Когда-нибудь пробовал ответить? –