# 二分查找

很经典的查找问题, 就是在一个有序列表中查找目标值, 一般我们认为列表是升序的接口

function binarySearch(arr, l, r, target) {
  if (l > r) {
    return -1;
  }
  let mid = Math.floor(l + (r - l) / 2);
  if (arr[mid] === target) {
    return mid;
  } else {
    if (arr[mid] > target) {
      return binarySearch(arr, l, mid - 1, target);
    } else {
      return binarySearch(arr, mid + 1, r, target);
    }
  }
}

扩展问题, 比如获取某一个在列表的中的范围, 比如

[1, 2 ,3 ,4, 4, 4, 5, 6]找到4的范围为[3, 5]

function searchRange(arr, l, r, target) {
  const mid = binarySearch(arr, l, r, target);
  if (mid === -1) return [-1, -1];
  let start = mid,
    end = mid;
  while (start - 1 >= l && arr[start - 1] === target) {
    start--;
  }
  while (end + 1 <= r && arr[end + 1] === target) {
    end++;
  }

  return [start, end];
}
上次更新: 1/22/2025, 9:39:13 AM