Skip to content

二分搜索的要点

  • 注意自己定义的区间到底是什么
  • 如果是左闭右开的[,)这种风格,那么就要明确记得左区间真的取得到,右区间真的取不到
    • 你非要写左开右闭也行
  • 或者说始终记得维持一个左闭右开区间
  • 所以在每次二分更新判断大小的时候也要注意
    • 如果 middle 值大于 target,因为 middle 值取不到,右区间更新为 middle 即可,因为右区间本身也取不到,下一个区间不会在意 middle 处的值
    • 如果 middle 值小于 target,由于 middle 值取得到,为了下一个区间不重复搜索,就要把左区间+1

实现 704

js
let search = function (nums, target) {
  let left = 0;
  let right = nums.length;
  // 这里选择左闭右开的写法,主要是因为个人觉得编成语言取数基本都是这个风格
  // 所以这里的left不可能等于right
  while (left < right) {
    let middle = left + ((right - left) >> 1);
    if (nums[middle] > target) {
      // 直接更新右区间为middle是因为右区间是开区间,本身取不到,middle值也取不到
      right = middle;
    } else if (nums[middle] < target) {
      // 但左区间取得到,下一个区间不应包含middle
      left = middle + 1;
    } else {
      return middle;
    }
  }
  return -1;
};