二分法

  • 利用单调性,来判断最小值所在的区间。
  • 当nums[mid]==nums[right]是无法判断的,[0,1,1,1,1]在左边,[2,3,4,1,1,1,1]自己本身,[2,2,2,1,2]在右边。
  • 通过right-1来缩写范围,原理,每次都不会排除最小值。旋转个数为0时,此时时间复杂度是O(n)。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int min_val=0;
    void find_min(vector<int>& nums,int left,int right)
    {

        if(right<left)
        {
            return;
        }
        if(right==left)
        {
            min_val=nums[right];
            return;
        }
        int mid=(left+right)/2;
        int min_val=nums[right];
        if (nums[mid]<min_val)
        {
            //最小值在mid的左边/mid
            find_min(nums,left,mid);

        }
        else if(nums[mid]>min_val)
        {
            //最大值在mid的右边
            find_min(nums,mid+1,right);

        }
        else{
            //无法判断
            find_min(nums,left,right-1);

        }
    }
    int minNumberInRotateArray(vector<int>& nums) {
        // write code here
        min_val=nums[nums.size()-1];
        find_min(nums,0,nums.size()-1);
        return min_val;

    }
};