Ctrl K

Поиск делением наугад

Средняя
Один стажёр написал поиск «как двоичный», но не стал проверять, отсортирован ли список. Его функция ищет число target в последовательности так: 1. Пока последовательность не пуста, выбирается **случайный** её элемент — ориентир. 2. Если ориентир равен target, поиск успешен. 3. Если ориентир меньше target, из последовательности удаляются ориентир и всё, что левее него. 4. Если ориентир больше target, удаляются ориентир и всё, что правее него. 5. Если последовательность опустела, поиск неудачен. Дан массив values из попарно различных целых чисел, необязательно отсортированный. Посчитайте, сколько чисел из values эта функция находит **при любом** выборе ориентиров.
Пример 1
values=[2, 1, 3, 5, 4] → 1

Только 3 больше всех чисел слева от себя и меньше всех справа. Какой бы ориентир ни выпал, 3 никогда не окажется в отброшенной части. Например, 2 при поиске 1 не найдётся: если первым выпадет 2, вместе с ней уйдёт и всё правее, то есть сама 1.

Пример 2
values=[-4, 0, 9] → 3

Список уже упорядочен, поэтому поиск надёжен для каждого из трёх чисел.

Пример 3
values=[6, 5, 4] → 0

Каждое число может потеряться: например, при поиске 6 первым может выпасть 4 — она меньше цели, и вместе с ней отбрасывается всё левее, включая 6.

Ограничения
  • 1 ≤ len(values) ≤ 10⁵
  • -10⁵ ≤ values[i] ≤ 10⁵
  • Все числа в values различны
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиПоиск в сдвинутом отсортированном массиве СредняяПервая и последняя копия СредняяПоиск в таблице-цепочке СредняяПоиск в сдвинутом массиве с повторами СредняяМинимум в сдвинутом списке Средняя
загружаем Python…
Вход
values=[2, 1, 3, 5, 4]
Ожидается
1

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 133 теста на сервере, включая скрытые.