分析: 旋转数组就是将一组有序的数组分成了两部分有序的数组,在原始数组中,第一个元素就是最小的元素,旋转后两部分交界无序的点就是最少值了,因为两部分数组还是有序的,所以可以考虑用二分查找来做。 具体做法:

  1. 创建两个指针left和right,分别指向数组的首尾
  2. 如果区间中点值小于right值,说明最小值在左边,令right=mid
  3. 如果区间中点值大于right值,说明最小值在右边,令left=mid+1
  4. 如果区间中点值等于right值,那么就有点难以判断了,这个时候只能逐一减少right值,缩减右界

实现:

import java.util.*;
import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int left=0;
        int right=array.length-1;
        int mid;
        while(left<right){
            mid=(left+right)>>>1;
            if(array[mid]<array[right]){
                //如果中间值大于右边值,说明最小值在左边的区间
                right=mid;
            }else if(array[mid]==array[right]){
                //如果中间值等于右边值,这种情况不好判断,只能逐一缩减右界
                right--;
            }else{
                //如果中间值小于右边值,说明最小值在右边的区间
                left=mid+1;
            }
}
        return array[left];
    
    }
}