剑指offer 7.旋转数组的最小数字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiangxianghehe/article/details/88824919

牛客网地址:旋转数组的最小数字

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

追简单的方法是遍历数组,不过这没办法用到有序的特性,最快的解法应该是二分法。

解析:

  1. 我们用两个指针分别指向数组的第一个元素和最后一个元素。
  2. 接着我们可以找到数组中间的元素:如果该中间元素位于前面的递增子数组,那么它应该大于或者等于第一个指针指向的元素。此时数组中最小的元素应该位于该中间元素的后面。我们可以把第一个指针指向该中间元素,这样可以缩小寻找的范围。移动之后的第一个指针仍然位于前面的递增子数组之中。如果中间元素位于后面的递增子数组,那么它应该小于或者等于第二个指针指向的元素。此时该数组中最小的元素应该位于该中间元素的前面。
  3. 接下来我们再用更新之后的两个指针,重复做新一轮的查找。

代码:

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.size()==0)
            return 0;
        int low = 0;
        int high = rotateArray.size() - 1;
        int middle = low;
        int min = rotateArray[low];
        while(rotateArray[low]>=rotateArray[high])
        {
            if((high - low)== 1)
            {
                min = rotateArray[high];
                break;
            }
            middle = (low + high)/2;
            if(rotateArray[middle]>=rotateArray[low])
                low = middle;
            else
                high  = middle;
        }
        return min;
        
        
    }
};

猜你喜欢

转载自blog.csdn.net/xiangxianghehe/article/details/88824919