牛客题霸NC71旋转数组的最小数字Java题解
https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=117&&tqId=34993&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
方法:二分法
解题思路: ①当 array[mid] > array[j] 时: mid一定在左排序数组中,即旋转点x一定在[mid+1,j]闭区间内,因此执行i=mid+1
②当 array[mid] < array[j] 时:mid 一定在右排序数组中,即旋转点x一定在[i,mid]闭区间内,因此执行j=mid
③当 array[mid] = array[j] 时:无法判断 mid 在哪个排序数组中,可直接放弃二分查找,而使用线性查找替代。

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int i = 0;
        int j = array.length-1;

        while(i<j){    
            int mid = (i+j)/2;
            if(array[mid]>array[j]){   //当 array[mid] > array[j] 时: mid一定在左排序数组中,即旋转点x一定在[mid+1,j]闭区间内,因此执行i=mid+1     
                i=mid+1;
            }else if(array[mid]<array[j]){ //当 array[mid] < array[j] 时:mid 一定在右排序数组中,即旋转点x一定在[i,mid]闭区间内,因此执行j=mid
                j=mid
            }else{                         //当 array[mid] = array[j] 时:无法判断 mid 在哪个排序数组中,可直接放弃二分查找,而使用线性查找替代
                int res = array[i];
                for(int k=i;k<=j;k++){
                    if(array[k]<res){
                        res = array[k];
                    }
                }
                return res;
            }
        }
        return array[i];
    }
}