题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

分析:
采用了两种思路,第一种是简单的暴力查找,第二种是利用二分法,因为数组是非递减排序,因此会有三种情况,第一种,3,4,5,1,2,最小值在中间值右面(中间值大于最高位的值,令最低位等于中间值+1继续找);第二种4,5,1,2,3,最小值在中间值左面或等于中间值(中间值小于最高位的值,令最高位等于中间值继续找);第三种1,0,1,1,1,这种情况只能一个一个查找,缩进,基于以上思路设计二分法。
代码:

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        /*int len=rotateArray.size();
        if(len==0) return 0;
        int min=rotateArray[len-1];
        for(int i=len-2;i>=0;i--)
        {
            if(rotateArray[i]<=min)
                min=rotateArray[i];
        }
        return min;*/

        //二分法,注意是一个非递减排序,可能存在重复
        int low=0;
        int high=rotateArray.size()-1;
        int mid;
        while(low<high)
        {
            mid=low+(high-low)/2;
            if(rotateArray[mid]>rotateArray[high])
            {
                low=mid+1;//3,4,5,1,2最小值一定在mid右面
            }
            else if(rotateArray[mid]==rotateArray[high])
            {
                high=high-1;//1,0,1,1,1只能一个个找,缩进
            }
            else
            {
                high=mid;//4,5,1,2,3从mid开始都是递增的
            }
        }
        return rotateArray[low];
    }
};