二分查找

321 阅读1分钟

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

在 JS 中,可以直接使用 indexOf 解决:

var search = function(nums, target) {
    return nums.indexOf(target)
}

所以,尝试去实现 JS, indexOf方法。

方法一:常规解决方案,遍历数组,当出现时 return 下标,当数组遍历到大于该数时没有出现该数字则 return -1。

ScreenRecorderProject2_1.gif

var search = function(nums, target) {
    for(let index = 0 ; index < nums.length; index++) {
        const num = nums[index]
        if (num === target) {
           return index
        } else if (num > target) {
            return -1
        }
    }
    return -1
}

方法二:二分法

ScreenRecorderProject3_1.gif

通过图解和判断可以得知以下可以省去遍历的步骤:

1.当左侧遍历 < 目标值时,没有必要遍历左侧元素

2.当右侧遍历 > 目标值时,没有必要遍历右侧元素

3.两侧都满足 1,2两个条件时候,返回 -1

4.左侧遍历至下标0,右侧遍历至结束如果没有匹配,则返回 -1

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