把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个升序的数组的一个旋转,输出旋转数组的最小元素。
例如数组 {3,4,5,1,2}{3,4,5,1,2} 为 {1,2,3,4,5}{1,2,3,4,5} 的一个旋转,该数组的最小值为 11。
数组可能包含重复项。
注意:数组内所含元素非负,若数组大小为 00,请返回 −1−1。
数据范围
数组长度 [0,90][0,90]。
样例
输入:nums = [2, 2, 2, 0, 1]
输出:0
代码:
int findMin(int* nums, int numsSize) {
if(numsSize == 0) return -1; // 数组大小为0,返回-1
while(numsSize > 0 && nums[numsSize-1 ] == nums[0]) numsSize--; // 去除尾部相同元素
if (nums[numsSize-1] >= nums[0]) return nums[0]; // 如果数组绝对递增,第一个值就是最小的
int right = numsSize;
int left = 0;
int mid = left + (right - left ) / 2;
// 二分,找最小元素
while(left < right){
if(nums[mid] < nums[0]){
right = mid; // 所要找的值在[l,mid] 中
}
else{
left = mid + 1; // 所要找的值在[mid + 1 , right]中
}
mid = left + (right - left) / 2;
}
return nums[right];
}