704. 二分查找

LeetCode 原题链接

图片

实现思路

  • 这道题的特点是给的数据已经是有序的,因此可以通过二分法直接找中间值进行比较,一次比较就能将搜索范围缩小一半,直到找到目标值或者搜索范围为空。
  • 需要注意的是每次搜索的边界的更新,mid 在比较的时候已经被访问过了,所以在更新 left 和 right 的时候需要加一或者减一,避免死循环。

代码实现

/**
 * 时间复杂度:O(log n),其中 n 是数组 nums 的长度。二分查找算法的时间复杂度为 O(log n),因为每次迭代都会将搜索范围缩小一半。
 * 空间复杂度:O(1),使用了常数级别的额外空间。算法只使用了几个变量来存储索引和中间结果,没有使用与输入规模相关的额外空间。
 */
var search = function (nums, target) {
  // 定义左右指针
  let left = 0;
  let right = nums.length - 1;

  // 结束条件是左右指针相遇
  while (left <= right) {
    // 计算中间索引,避免溢出
    const mid = left + Math.floor((right - left) / 2);

    // 如果中间值等于目标值,返回索引
    if (nums[mid] === target) {
      return mid;
    } else if (nums[mid] < target) {
      // 如果中间值小于目标值,说明目标值在右半部分,更新左指针
      left = mid + 1;
    } else {
      // 如果中间值大于目标值,说明目标值在左半部分,更新右指针
      right = mid - 1;
    }
  }

  // 如果循环结束后仍未找到目标值,返回 -1
  return -1;
};