返回

用代码优雅地“安家”:LeetCode 第 35 题的插入技巧

后端

二分查找算法:在排序数组中寻找目标元素的插入位置

背景介绍

在计算机科学中,二分查找是一种高效的算法,用于在有序数组中搜索特定元素。它通过不断将搜索范围缩小一半来快速查找元素,效率远高于线性搜索。

二分查找算法的工作原理

二分查找算法的工作原理如下:

  1. 初始化搜索范围: 将数组的第一个元素索引设置为左指针(left),最后一个元素索引设置为右指针(right)。
  2. 计算中间索引: 计算数组中间索引 mid,作为潜在的元素位置。
  3. 比较中间元素: 比较数组中 mid 索引处的元素与目标元素(target)。
    • 如果它们相等,则找到目标元素的位置,返回 mid
    • 如果 nums[mid] < target,则目标元素一定在数组的右侧。将 left 指针更新为 mid + 1,继续搜索。
    • 如果 nums[mid] > target,则目标元素一定在数组的左侧。将 right 指针更新为 mid - 1,继续搜索。
  4. 缩小搜索范围: 如果 left 指针大于 right 指针,则表明没有找到目标元素。返回 left,表示目标元素应被插入的位置。
  5. 重复步骤 2-4: 重复步骤 2-4,直到找到目标元素或搜索范围缩小为零。

代码示例

def binary_search(nums, target):
  """
  在排序数组中执行二分查找。

  参数:
    nums:排序数组
    target:目标元素

  返回:
    如果找到目标元素,则返回其索引;否则,返回 -1。
  """

  left = 0
  right = len(nums) - 1

  while left <= right:
    mid = (left + right) // 2

    if nums[mid] == target:
      return mid

    elif nums[mid] < target:
      left = mid + 1

    else:
      right = mid - 1

  # 如果找不到目标元素,返回 -1
  return -1

应用场景

二分查找算法在以下场景中非常有用:

  • 在大量数据集中快速搜索特定元素。
  • 在需要高效查找元素的应用程序中,例如数据库和搜索引擎。
  • 在需要排序数据并快速访问特定元素的算法中,例如优先级队列和哈希表。

结论

二分查找算法是一种强大且高效的算法,用于在有序数组中搜索特定元素。通过不断将搜索范围缩小一半,它可以快速且准确地找到元素或确定其不存在。在需要高效数据查找的各种应用程序中,二分查找算法都是一种宝贵的工具。

常见问题解答

  1. 二分查找只能用于有序数组吗?

    • 是的,二分查找算法要求数组是有序的,以确保每次迭代都能缩小搜索范围。
  2. 如果目标元素不存在,二分查找算法会返回什么?

    • 如果目标元素不存在,二分查找算法通常返回一个特殊值(例如 -1),表示元素不存在。
  3. 二分查找算法的时间复杂度是多少?

    • 二分查找算法的时间复杂度为 O(log n),其中 n 是数组中的元素数量。
  4. 二分查找算法与线性搜索算法有什么区别?

    • 二分查找算法比线性搜索算法更有效率,因为每次迭代都会将搜索范围缩小一半。线性搜索算法的时间复杂度为 O(n),这意味着它需要遍历整个数组。
  5. 二分查找算法可以修改数组吗?

    • 不,二分查找算法不会修改数组。它只在数组上执行读取操作。