LeetCode11 旋转数组的最小数

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [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 };

 

posted @ 2020-07-22 16:18  __rookie  阅读(127)  评论(0编辑  收藏  举报