Поиск в отсортированном повернутом массиве

Дан массив длины n, который изначально был отсортирован по возрастанию, а затем повернут от 1 до n раз. Например, массив nums = [1,2,3,4,5,6] мог стать:

  • [3,4,5,6,1,2] если его повернули 4 раза
  • [1,2,3,4,5,6] если его повернули 6 раз

Дан повернутый отсортированный массив nums и целое число target, верните индекс target в массиве nums или -1, если такого элемента нет.

Можно считать, что все элементы в отсортированном повернутом массиве nums уникальны.

Тривиальное решение работает за O(n), можете ли вы написать алгоритм, который работает за O(log n)?

Пример 1:

Input: nums = [3,4,5,6,1,2], target = 1
Output: 4

Пример 2:

Input: nums = [3,5,6,0,1,2], target = 4
Output: -1

Рекомендуемая временная и пространственная сложность

Оптимальное решение имеет временную сложность O(log n) и пространственную сложность O(1), где n — размер входного массива.


Подсказка 1

Линейный поиск даст нам O(n). Для достижения O(log n) подумайте о бинарном поиске. Как его можно модифицировать для работы с повернутым массивом?


Подсказка 2

В любой точке массива одна половина всегда будет отсортирована. Как это можно использовать?


Подсказка 3

Определив, какая половина отсортирована, мы можем проверить, находится ли целевое значение в этом диапазоне. Если да - ищем там, если нет - в другой половине.

Эта задача проверяет навыки реализации бинарного поиска и работы с отсортированными массивами. Она развивает понимание алгоритмической сложности и способность находить оптимальные решения для модифицированных структур данных.

Входные параметры :

[3,4,5,6,1,2], 1

Ожидаемый результат

4