每周一道LeetCode - 二分法33

22 阅读1分钟

leetcode33题

搜索旋转排序数组题述:

在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

解题方法:

通过旋转后的数组,取中间索引的值,总是会存在要么左半部分有序,要么右半部分有序。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let left = 0
    let right = nums.length - 1
    while(left <= right) {
        const middle = Math.floor((left + right) / 2)
        if (target === nums[middle]) return middle
        // 左半部分有序
        if (nums[left] <= nums[middle]) {
            // 目标定位在左半部分
            target >= nums[left] && target < nums[middle] ? (right = middle - 1) : (left = middle + 1)
        } else {
            // 左半部分无序那么右半部分一定是有序的
            // 目标定位在右半部分
            target> nums[middle] && target <= nums[right] ? (left = middle + 1) : (right = middle - 1)
        }
    }
    return -1
}