美文网首页
旋转数组的最小数字

旋转数组的最小数字

作者: 掌灬纹 | 来源:发表于2019-01-28 19:48 被阅读0次

    问题:

    把一个数组最开始的若干元素搬到数组末尾

    输入一个递增排序数组的一个旋转,输出该元素的最小值

    如{3,4,5,1,2}为{1,2,3,4,5}的一个旋转数组

    输出最小值为1

    思路:

    递增数组的旋转,二分法思维,中间值分成两个区域,一定一边有序,一边无序。

    中间值比最左值大 左侧有序 否则 右侧有序

    且最小的数一定在无序的一侧(因为最小的数一定是原数组中第一个数)每次切掉

    有序的一半,直到剩下两个元素,最小的数一定是第二个数。

    如果原数组是特殊的形如全部相等元素的数组,则考虑遍历法找到最小的数。

    (Java代码参考)

    public static void main(String[] args) {

    int[] a = {3,4,5,1,2};

    // int[] a = {1,1,1,0,1};

    int res = min(a);

    System.out.println(res);

    }

    static int min(int[] arr) {

    int begin = 0;

    int end = arr.length-1;

    //没有旋转

    if(arr[begin] < arr[end]) return arr[begin];

    //直到只剩两个元素结束

    while(begin + 1 < end) {

    int mid = begin + ((end - begin)>>1);

    if(arr[begin] == arr[mid] || arr[end] == arr[mid]) {//特殊数组

    int minIndex = 0;

    int min = arr[0];

    for(int i = 0; i < arr.length; i++) {

    if(arr[i] < min) {

    minIndex = i;

    min = arr[i];

    }

    }

    return arr[minIndex];

    }

    if(arr[mid] > arr[begin]) {//左边有序

    begin = mid;

    }else {//右边有序

    end = mid;

    }

    }

    return arr[end];//最后剩两个数,右边的一定是最小的

    }

    相关文章

      网友评论

          本文标题:旋转数组的最小数字

          本文链接:https://www.haomeiwen.com/subject/rplzjqtx.html