漫画:什么是二分查找?

murphy_gb

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let l = 0,
        r = nums.length - 1,
        mid;
    while(l <= r) {
        mid = Math.floor((l + r)/2);
        if(nums[mid] == target){
            return mid;
        }else if(nums[mid] < target){
            l = mid + 1;
        }else{
            r = mid - 1;
        }
    }
    return -1;
};

注意:

  1. 将r位置初始在最后一位(nums.length-1)的话,表示是左闭右闭的区间[nums[0],nums[nums.length-1]],因此在while退出循环条件中要 <=
  2. 注意JS的 / 的结果并不是整除,因此需要使用Math.floor取整
  3. 如果mid所在的元素与target不一致,扩大(或缩小)搜索的区间范围时,要注意排除掉已经比较过的mid,即需要 mid+1(或 mid-1)