这里是我自己画的,最直观的图片了,经过旋转后,数据是分层的,通过分层的数据,确实可以快速定位到,最小值的位置。

nums[mid] < nums[high] nums[mid] > nums[high] nums[mid] < nums[high]

最小值在中间 最小值在右间 最小值在左间

解题思路:

从上面可以看到,因为旋转后的数据,依旧是分层的,还是可以快速判断,最小值在那一边。

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int minNumberInRotateArray (int[] nums) {
        int low = 0;
        int high = nums.length -1;
        while(low <= high) {
            int mid = low + (high - low) /2;
            // 不好确认在左右,所以排除掉最后面的一个,再一个个试
            if(nums[mid] == nums[high]) {
                high = high - 1;
            } 
            // 说明最小数在右边
            else if(nums[mid] > nums[high]) { 
                low = mid + 1;
            }
            // 说明最小数在左边
            else {
                high = mid;
            }
        }
        return nums[low];
    }
}

当数据是【6,4】的时候

第一次循环

第二次循环

mid

0

因为low==high退出循环了,所以最终low=1

low

1

high

1

所以最终的low的值是1

当数据是【1,0,1,1】

第一次循环

第二次循环

第三次循环

mid

1

0

因为low==high退出循环,所以最终low=1

low

0

1

high

1

1