【leetcode】33. 搜索旋转排序数组

46 阅读1分钟

leetcode-33.png

  • 判断哪一部分是有序的

    • 通过检查中间元素和左右边界的关系,确定左半部分或右半部分是有序的。
  • 缩小搜索范围

    • 如果目标值在有序部分的范围内,则继续在该部分中进行二分查找。
    • 否则,在另一部分中进行搜索。

错误的代码

这里的错误主要第九行,对于区间的划分不清晰

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

正确的代码

这里的区间划分就很清晰,不需要考虑那么多,只需要看是左边有序还是右边

var search = function (nums, target) {
    let left = 0, right = nums.length - 1
    while (left <= right) {
        let mid = Math.floor((left + right) / 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
};