解法:二分法
查看官方题解
要画图理解各种情况,接下来照搬三张官方图:
在第三种情况下,不确定最小元素在mid的左侧还是右侧。只能通过减小right来逐步缩小区间。
int minArray(int* numbers, int numbersSize){
int left = 0, right = numbersSize - 1;
while(left < right)
{
int mid = left + (right - left)/2;
if(numbers[mid] < numbers[right]) right = mid;
else if(numbers[mid] > numbers[right]) left = mid + 1;
else right--;
}
return numbers[left];
}
时间复杂度 O ( l o g n ) O(logn) O(logn),空间复杂度 O ( 1 ) O(1) O(1)。