把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例 1:
输入:[3,4,5,1,2]
输出:1
示例 2:
输入:[2,2,2,0,1]
输出:0
同样用二分查找。对于mid,如果小于right,就说明右侧是有序的,mid右边的都不会是最小的,right=mid;如果大于right,说明包括的mid的左侧都是更大的,left=mid+1;如果mid=right,那就出现了多个相似的数的情况,不能判断mid是处于目标数左侧还是右侧,但是可以肯定的是,right的左侧还有和right相同的数,--right。
1 class Solution { 2 public: 3 int minArray(vector<int>& numbers) { 4 int left=0,right=numbers.size()-1; 5 while(left<right){ 6 int mid=left+((right-left)>>1); 7 if(numbers[mid]>numbers[right]){ 8 left=mid+1; 9 } 10 else if(numbers[mid]<numbers[right]){ 11 right=mid; 12 } 13 else{ 14 --right; 15 } 16 } 17 return numbers[left]; 18 } 19 20 21 };