剑指offer_旋转数组的最小数字

84 阅读1分钟

题目链接:www.acwing.com/problem/con…

分析

  1. 二分 性质是 是否大于 nums[0]
  2. 严格确保 第一段 >= nums[0] 第二段< nums[0] 需要 while(n > 0 && nums[n] == nums[0]) n--;
  3. 二分 3.1 if(nums[mid] < nums[0]) 第二段 找第二段的第一个点 r = mid 3.2 else 第一段 l = mid + 1

Code

/**
 * @param {number[]} nums
 * @return {number}
 */
var findMin = function(nums) {
    let n = nums.length - 1;
    if(n < 0) return -1;
    //
    while(n > 0 && nums[n] == nums[0]) n--;
    if(nums[n] >= nums[0]) return nums[0]; //说明第二段没有
    let l = 0, r = n;
    while(l < r){
        let mid = l + r >> 1;
        if(nums[mid] < nums[0]) r = mid;
        else l = mid + 1;
    }
    
    return nums[l];
};