剑指offer6:旋转数组的最小数字

题目来源:剑指6旋转数组的最小数字

题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

解题思路:用二分法,见代码

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int size=rotateArray.size();
        if(size==0) return 0;
        int left=0,right=size-1,mid=0;
        // rotateArray[left] >= rotateArray[right] 确保旋转
        while(rotateArray[left]>=rotateArray[right]){
            if(right-left==1)
            {
                mid=right;
                break;
            }
            mid=left+(right-left)/2;
            //三者相等无法确定中间元素属于前面还是后面,故采用顺序查找最小值
            if(rotateArray[left]==rotateArray[right]&&rotateArray[left]==rotateArray[mid])
            {
                return OrderFind(rotateArray,left,right);
            }
            //中间元素位于前面的子数组,此时最小元素位于中间元素的后面
            else if(rotateArray[mid]>=rotateArray[left])
            {
                left=mid;
            }
            //中间元素位于后面的子数组,此时最小元素位于中间元素的前面
            else if(rotateArray[mid]<=rotateArray[right])
            {
                right=mid;
            }
        }
        return rotateArray[mid];
    }
private:
    int OrderFind(vector<int> rotateArray,int left,int right)
    {
        int result=rotateArray[left];
        for(int i=left;i<=right;i++)
        {
            if(result>rotateArray[i]) result=rotateArray[i];
        }
        return result;
        
    }
};
posted @ 2020-07-01 01:38  拉里拉里啦啦  阅读(91)  评论(0编辑  收藏  举报