【Leetcode】6找出旋转数组里的最小值

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

思路:1,排序(用sort函数,#include<algorithm>),然后输出最小值,非题目本意

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        sort(rotateArray.begin(),rotateArray.end());
        return rotateArray[0];
    }
};

            2,非减数组,那么旋转过后会出现断崖,断崖处就是出现最小值的地方。但是这样最差的情况还是要遍历。

 public int minNumberInRotateArray(int[] array) {
        if (array.length == 0)
            return 0;
        for (int i = 0; i < array.length - 1; i++) {
            if (array[i] > array[i + 1])
                return array[i + 1];
        }
        return array[0];
    } 

           3,二分查找。旋转之后,前边的部分大于等于后边的部分。

public static int minNumberInRotateArray(int[] array) {
        if (array.length == 0)
            return 0;
        int left = 0;
        int right = array.length - 1;
        int middle = -1;
        while (array[left]>=array[right]) {//直到出现左边的小于右边的
            if(right-left==1){//如果查找至左右指针挨着
                middle = right;//就直接返回右指针对象
                break;
            }
            middle = left + (right - left) / 2;//中间元素索引
            if (array[middle] >= array[left]) {//如果中间的大于左指针处,说明中间元素还处于左部分(旋转到前边去的那部分)
                left = middle;//左指针移到这里,缩小范围
            }
            if (array[middle] <= array[right]) {//中间的元素小于右边的,说明中间元素在右部分
                right = middle;
            }
        }
        return array[middle];
    }

猜你喜欢

转载自blog.csdn.net/ethan_guo/article/details/81179802