import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int minNumberInRotateArray (int[] nums) {
        // write code here
        //当最后一个元素是最小值时
        if(nums[nums.length-2]>nums[nums.length-1]) return nums[nums.length-1];
        int left = 0;
        int right = nums.length-2;
        int mid = (left+right)/2;
        while(left<=right){
            while(nums[mid]==nums[left]) left++;
            while(nums[mid]==nums[right]) right--;
            mid = (left+right)/2;
            if(mid==0) {
                if(nums[mid]<nums[mid+1]) return nums[mid];
            }
            if(nums[mid]>nums[mid+1]) return nums[mid+1];
            if(nums[mid]<nums[mid-1]) return nums[mid];
            else if(nums[mid] >= nums[mid-1] && nums[mid] <= nums[mid+1]) {
                if(nums[mid]>nums[0]) left = mid+1;
                if(nums[mid]<nums[0]) right = mid-1;
            }
        }
        return nums[mid];
    }
}

处理边缘元素为最小值的情况,

处理元素相等的情况,移动left或者right即可。(nums[mid]==nums[left]说明left可以排除在求解的区间外,因为如果left是最小值,那么mid也是最小值。)

当left<mid<right时,如何划分区间呢?这里利用了旋转的性质,因为旋转,所以数组是两部分非降序数组拼接而成,且后一部分的数组小于nums[0],所以可以得到:

如果mid>nums[0],mid在前一部分数组;

否则mid在后一部分数组。(mid和nums[0]相等的情况在前面已经处理了)