Menu
CoddyTech

Search in Rotated Sorted Array

Список различных целых чисел был отсортирован по возрастанию, а затем циклически сдвинут: некоторое количество элементов, возможно ноль, взяли из начала и переместили в конец в том же порядке. Например, после сдвига на 4 список [2, 5, 8, 11, 15, 19, 23] становится [15, 19, 23, 2, 5, 8, 11]. Дан сдвинутый список nums и целое число target. Верните индекс target в nums, считая с 0, или -1, если его там нет, за время O(log n).

Функция

search(nums: integer-array, target: integer) → integer
numsinteger-array
повёрнутый отсортированный список различных целых чисел
targetinteger
значение, которое нужно найти
Возвращаетinteger
индекс target в nums или -1, если он отсутствует

Ограничения

  • 1 ≤ nums.length ≤ 5000
  • -104 ≤ nums[i], target ≤ 104
  • Все значения в nums различны.
  • nums — это возрастающий список, повёрнутый на некоторое значение k, где 0 ≤ k < nums.length; при k = 0 он остаётся неповёрнутым.

Примеры

Ввод
nums = [15, 19, 23, 2, 5, 8, 11]target = 5
Вывод
4
Пояснение
5 находится по индексу 4. В первом среднем элементе, по индексу 3, находится 2, поэтому правая половина [2, 5, 8, 11] отсортирована, а 5 находится между 2 и 11. В следующем среднем элементе, по индексу 5, находится 8; отсортированная левая часть [5, 8] содержит 5, что приводит к индексу 4.

lock icon+23 скрытых тестов при отправке

challenge icon

Дополнительный вопрос

Если nums может содержать дубликаты, ни один алгоритм не может гарантировать O(log n). Можешь это доказать? Составь повёрнутый список из единиц со спрятанным в нём единственным нулём, так чтобы при любом поиске нуля приходилось просматривать каждый элемент.

Сбросить код
def search(nums, target):
    # Напишите код здесь
Тестовые случаи

Случай 1

Случай 2

Случай 3

Ввод

nums = [15, 19, 23, 2, 5, 8, 11]
target = 5

Ожидается

4