Menu
CoddyTech

Search in Rotated Sorted Array

Список различных целых чисел был отсортирован по возрастанию, а затем циклически сдвинут: некоторое количество элементов, возможно ноль, взяли из начала и переместили в конец в том же порядке. Например, после циклического сдвига [2, 5, 8, 11, 15, 19, 23] на 4 позиции получится [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
Пояснение
Первый средний элемент, индекс 3, содержит 2, поэтому правая половина [2, 5, 8, 11] отсортирована и содержит 5. Следующий средний элемент, индекс 5, содержит 8; отсортированная левая часть [5, 8] содержит 5, что приводит к индексу 4.
challenge icon

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

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

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

Тест #1

Тест #2

Тест #3

Аргументы

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

Ожидаемый вывод

4