剑指Offer(牛客版)--面试题11:旋转数组的最小数字

剑指Offer(牛客版)--面试题11:旋转数组的最小数字


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

完整代码:

 

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        //统计容器的元素个数
        int length = rotateArray.size();
        //检查输入的合法性
        if(length==0)
            return 0;
         //定义游标1并初始化
        int index1=0;
         //定义游标2并初始化
        int index2=length-1;
        //定义IndexMid为只想数组的最小元素并初始化为指向数组的第一个元素,理由是:如果0个元素旋转到数组末尾,即数组本身该数组还是旋转数组,
        //此时数组第一个元素小于最后一个元素,则第一个元素必为最小值
        int indexMid = index1;
        //按照旋转数组的规则,第一个元素大于或等于最后一个元素
        while(rotateArray[index1]>=rotateArray[index2])
        {
            //如果两个游标指向相邻的元素
            if(index2-index1==1)
            {
                //第二个游标所指即为数组的最小元素
                indexMid=index2;
                break;
            }
            
            //如果不是上面的情况,则寻找中间元素
            indexMid=(index1+index2)/2;
            
            //当游标1和游标2、最小元素游标指向相同元素
            //采用顺序查找
            if(rotateArray[index1]==rotateArray[index2]&& rotateArray[indexMid]==rotateArray[index2])
            {
                //从起始游标处开始
                int result = rotateArray[index1];
                //遍历整个数组
                for(int i=index1+1;i<length-1;++i)
                {
                    //如果发现有最小的数值
                    if(result>rotateArray[i])
                        result=rotateArray[i];//赋值给result
                }
                //返回最小值
                return result;
            }
            
            //正常情况下
            //当中间元素不小于游标1所指元素,说明分界点在后面
            if(rotateArray[indexMid]>=rotateArray[index1])
                index1=indexMid;   //将游标1移到中间元素的位置
            //当中间元素不大于游标2所指元素,说明分界点在前面
            else if(rotateArray[indexMid]<=rotateArray[index2])
                index2=indexMid;//将游标2移到中间元素的位置
        }
        //返回数组中最小的元素
        return rotateArray[indexMid];
    }
};

 

上一篇:【LEETCODE】46、999. Available Captures for Rook


下一篇:167 -两个Sum II - 输入数组已排序