Ваш переключатель if
переместится в ту сторону (else
), когда подрешетка (между left
и right
включительно) полностью поднимется. Поэтому вы должны проверить этот конкретный сценарий тоже.
Это вы делаете с дополнительным условием в вашем if
:
if arr[mid] > arr[right] or arr[left] < arr[right]:
Если первое условие ложно, то мы знаем, что arr[mid] < arr[right]
,Тогда, если также arr[left] < arr[right]
, мы можем сделать вывод, что также arr[left] < arr[right]
(если нет, то это не повернутый отсортированный список). И это означает, что подмассив полностью возрастает, а arr[right]
является наибольшим значением.
Таким образом, вы можете дополнительно оптимизировать и сразу выйти в этом случае:
if arr[mid] > arr[right]:
left = mid
elif arr[left] < arr[right]:
return arr[right]
else:
right = mid-1
Каксломать его
Есть только три способа, которыми можно заказать arr[left]
, arr[mid]
, arr[right]
:
arr[left] < arr[mid] < arr[right]
: максимальное значениеэто arr[right]
arr[mid] < arr[right] < arr[left]
: максимальное значение находится слева mid
arr[right] < arr[left] < arr[mid]
: максимальноезначение справа от mid
.
Любой другой порядок нарушит условие, что список является повернутым, отсортированным списком.