Выполните один двоичный поиск точки, в которой все элементы слева меньше вашего числа, а все справа равны или больше, а один - в точке, где все элементы меньше или равны слева и больше справа. ,
Другими словами: в одном поиске ваш «тест» равен <
, а в другом поиске - <=
.
Оба поиска log n
, так что это ваш итог.
Например, в C ++ вам понадобятся две функции: std::lower_bound
и std::upper_bound
- кажется, что существующие функции бинарного поиска Java (в коллекциях) всегда пытаются найти конкретное значение, так что вы, вероятно, имеете выполнить поиск самостоятельно, если вы используете это.
Важно, чтобы вы использовали вариант двоичного поиска, который использует только двоичный предикат! Если вы используете вариант, который проверяет, попал ли он по определенной клавише «случайно», он иногда слишком быстро завершается для этой конкретной задачи.