Проблема в вашем алгоритме заключается в том, что вы не уверены, что нашли точный пивот, когда его значение повторяется. Например, для массива [8,9,2,2,4,5,6]
ваш алгоритм находит как pivot элемент в 4-й позиции (отсчет от 0 - это элемент 3). Таким образом, левая часть массива будет [8,9,2]
, которая не отсортирована, и, следовательно, бинарный поиск не работает.
Очень простое решение - найти два центра (давайте вызовем left_pivot и right_pivot),Right_pivot - это именно тот, который вы уже нашли, и он определен как «элемент с самым низким значением массива». \ Left_pivot определен как «элемент с самым высоким значением массива», и вы обнаружите с помощьюпростое изменение:
while(left< right){
int mid= left+ (right- left)/ 2;
if (mid * 2 < right)
mid = mid + 1
// if mid< right that means this much part of the array is sorted
// then do binary search on left and mid
if(nums[mid]< nums[right])
right= mid-1;
// if mid> right that means this part of the array is not sorted
// then do binary search on mid+1 to right
else
left= mid;
}
Затем будет выполнен двоичный поиск в левой части массива от индекса 0 до индекса left_pivot (вместо pivot-1), а в правой части массива - отиндекс right_pivot к length-1