牛客网刷题(二) 旋转数组的最小值

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

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

  由于这个数组是由一定顺序的数组旋转而来的,在一定方面来说,是有一定顺序的,因此,我们不能全部遍历一遍来求它的最小值,这样时间复杂程度会过高,因此我们先通过二分查找,查找到它的中间值,并设数组下标为0的位置为low,下标为(ro.size()-1])为high,通过中间值与high位置上的值进行对比,发现其实找寻最小值有三种情况。

1.如果中间值大于high的值,我们发现最小值其实应该在中间值右边的部分,我们应该让数组low的位置往右边逼近,应该让low=mid+1;

2.如果中间值小于high的值,我们发现最小值其实应该在中间值左边的部分,我们应该让数组high的位置往左边逼近,应该让high=mid;

3.如果中间值等于high的值,我们发现最小值其实应该在high值左边的部分,但无法确定它在mid值的左边还是右边,我们应该让数组high位置慢慢向右边逼近,应该让high=high-1;

猜你喜欢

转载自blog.csdn.net/weixin_42736024/article/details/83480036
今日推荐