搜索旋转排序数组:必有一侧是有序的

25 阅读1分钟

[> ******](## 一、关键洞察

旋转数组的二分和普通二分只有一个区别:普通二分我们知道整个数组有序,旋转数组中必有一侧是有序的

判断哪一侧有序,然后看 target 是否在这一侧。

二、代码实现

var search = function(nums, target) {
    let left = 0, right = nums.length - 1;
    while (left <= right) {
        const mid = left + Math.floor((right - left) / 2);
        if (nums[mid] === target) return mid;
        
        if (nums[left] <= nums[mid]) {
            if (nums[left] <= target && target < nums[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        } else {
            if (nums[mid] < target && target <= nums[right]) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
    }
    return -1;
};

三、关键细节

nums[left] <= nums[mid] 判断左侧是否有序。

四、总结

  1. 旋转数组二分的关键:必有一侧有序
  2. 判断哪一侧有序,再判断 target 是否在其中
  3. 不包含重复数字时,nums[left] <= nums[mid] 即可判断)

cover.png