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

leetcode:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/

 

 

方法一:

有序数组查找,使用二分

进行二分,l、r、mid,两边必有一边是有序的

1、如果nums[l] <= nums[mid - 1],说明左侧有序

(1)、如果target在左侧,在查找范围缩小到左侧

(2)、如果target不在左侧,则一定在右侧,查找范围缩小到右侧

2、否则右侧一定有序

  (1)、如果target在右侧,在查找范围缩小到右侧

(2)、如果target不在右侧,则一定在左侧,查找范围缩小到左侧

 

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let l = 0;
    let r = nums.length - 1;
    let mid = -1;
    while (l <= r) {
        // 向上取整,避免l等于mid的情况
        mid = Math.ceil((l + r) / 2);
        console.log('l = ', l, ' r = ', r, ' mid = ', mid)
        if (target === nums[mid]) return mid;
        
        if (nums[l] <= nums[mid - 1]) {
            // 左侧有序
            if (target >= nums[l] && target <= nums[mid - 1]) {
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        } else {
            // 右侧有序
            if (target >= nums[mid + 1] && target <= nums[r]) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
    }
    return -1;
};

 

 

 

-----smile

posted @ 2021-04-07 18:50  Walker-lyl  阅读(56)  评论(0编辑  收藏  举报