二分查找来查找旋转数组

Posted TheQi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找来查找旋转数组相关的知识,希望对你有一定的参考价值。

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

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

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

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

 

二分查找代码

class Solution
{ public:
    int minNumberInRotateArray(vector<int> rotateArray) 
    {
        int len = rotateArray.size(); 
        if(len == 0) return 0; 
        int left = 0, right = len -1, mid = 0; 

        while(rotateArray[left] >= rotateArray[right])
        { 
            //左是大数组的最后一个,右是小数组的第一个,返回右的值
            if(right - left == 1)
            { 
                mid = right; 
                break; 
            } 
            mid = (left + right)/2; 
            //如果左,右,中间的值相等,不知道中间在哪个数组中,需要用笨方法查找
            if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid])
            { 
                return shunxuOrder(rotateArray, left, right); 
            } 
            //如果中间的值小于右边的值,那么中间的值在小数组中,让右等于中间的值
            //如果中间的值等于右边的值,此时中间的值一定小于左边的值才能走到这里,小于左边的值说明它在小数组里,让右等于中间的值
            if(rotateArray[mid] <= rotateArray[right])
            { 
                right = mid; 
            } 
            //如果中间的值大于右边的值,那么中间的值在大数组中,让左等于中间的值
            else
            { 
                left = mid; 
            } 
        } 
        return rotateArray[mid]; 
} 
private: int shunxuOrder(vector<int> &num, int left, int right)
         { 
             int i; 
             int result = num[left]; 
             for(i = left + 1; i < right; ++ i)
             { 
                 if(num[i] < result)
                 { 
                     result = num[i]; 
                 } 
             } 
             return result; 
         } 
};

 

以上是关于二分查找来查找旋转数组的主要内容,如果未能解决你的问题,请参考以下文章

旋转数组中的最小数字,剑指offer,P70 二分查找来实现O(logn)的查找

漫画算法:“旋转数组”中的二分查找

算法——查找:旋转数组的最小数字(改造二分法)

二分查找团灭力扣旋转排序数组系列

二分查找解决旋转数组

面试:谁说的无序不能用二分查找