题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

二分法,比较mid和右边界的关系,大于时表示最小值肯定在右边,小于时则在左边或者当前位置。
由于可能有重复数字,所以当mid和右边界重复时候,压缩范围,将右边界减1

class Solution {
public:
    int minArray(vector<int>& numbers) {
        int left=0,right=numbers.size()-1;
        int mid;
        while(left<right){
            mid=left+(right-left)/2;
            if(numbers[mid]==numbers[right]) right--;//相等时右边界左移,压缩范围
            else if(numbers[mid]>numbers[right]) left=mid+1;//大于时肯定不等于,所以mid+1作为左边界
            else right=mid;//小于时有可能等于,mid-1作为右边界
        }
        return numbers[left];
    }
};