青训营:二分查找题解 | 豆包MarsCode AI刷题

67 阅读2分钟

刷题的时候发现有很多题会用到二分查找作为优化算法,在这里总结一下:

二分查找作为一种经典的算法,广泛应用于许多问题中,主要适用于在有序数组中查找目标值,或者解决一些优化问题

1. 二分查找的基本概念

二分查找是一种在 有序 数列中查找目标元素的有效方法。它通过将查找范围逐步缩小一半,从而提高查找效率。其核心思想是 将待查找区间每次分成两半,然后判断目标元素是否在这两半之一,从而逐步缩小查找的范围,直到找到目标元素或确定元素不存在。

在代码运行超时时是常用的优化手段

2. 二分查找的基本步骤

  1. 初始化边界:设定查找区间的左右边界 leftright

  2. 计算中间值:通过 (left + right) // 2 计算中间索引。

  3. 比较

    • 如果中间值等于目标值,返回结果。
    • 如果中间值小于目标值,更新 left = mid + 1,缩小查找区间到右半部分。
    • 如果中间值大于目标值,更新 right = mid - 1,缩小查找区间到左半部分。
  4. 结束条件:当 left 超过 right 时,查找失败。

3. 常见二分查找题目类型

  1. 查找某个特定元素
  • 给定一个有序数组,查找目标元素是否存在。
  • 应用:简单的查找问题,可以直接使用标准二分查找。
  1. 查找第一个或最后一个满足某个条件的元素
  • 例如,查找第一个大于或等于目标值,或者查找最后一个小于目标值。
  • 技巧:在查找时,调整 leftright 的更新策略,以确保找到第一个或最后一个符合条件的元素。
  1. 查找最小值或最大值(常用于优化问题):
  • 问题:例如,给定一个函数或数列,查找最小值或最大值。
  • 应用:例如求解“最小化最大值”或“最优解”类型的问题,可以通过二分查找来找到最优解。

4. 二分查找的具体实现

二分查找通常可以通过递归或迭代方式实现。

递归实现

def binary_search(arr, target, left, right):
    if left > right:
        return -1  # 没有找到
    mid = (left + right) // 2
    if arr[mid] == target:
        return mid
    elif arr[mid] < target:
        return binary_search(arr, target, mid + 1, right)
    else:
        return binary_search(arr, target, left, mid - 1)

迭代实现

def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1  # 没有找到

要注意的是边界条件,这个时候通常可以通过模拟执行步骤来看看代码是否符合预期。