题:有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

数据范围:1 \le n \le 100001≤n≤10000,数组中任意元素的值: 0 \le val \le 100000≤val≤10000 要求:空间复杂度:O(1)O(1) ,时间复杂度:O(logn)O(logn)

分析: alt alt alt alt

算法的实现:(二分查找,简单遍历)

public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int left = 0;
        int right = array.length - 1;
        while (left < right){
            int mid = left + ((right - left) >> 1);
            if (array[mid] > array[right]){//由于数组是一种升序数组(准确的来说是非降序),那么数组在经过寻转之后时,从左往右左边的一部分是升序;
                left = mid + 1;            //当遇到数组中的最小数时就是其临界点;我们想使用二分的方式查找到这个临界点;使用里两个指针指向这两端
            } else if (array[mid] < array[right]){//当array[mid] > array[right]时,必有nums数组最小值的下标在mid与right之间,并且mid很明显不符合题意
                right = mid;                        //所以left = mid + 1;下面的right则是有可能充当最小值的,所以right = mid;当array[mid] == array[rght]时
                                                    //由于无法判断其在中点的哪一侧,所以且array[mid] = array[right],所以我们就将right--。缩减查找的范围;
                                                    
            } else {
                right = right - 1;
            }
        }
        return array[left];//返回数组中的最小值

        //方法二此种方式在数据量小的情况下比较占优
//         for (int i = 0; i < array.length - 1; i++) {
//             if (array[i] > array[i + 1]){
//                 return  array[i+1];
//             }
//         }
//         return array[0];
    }
}