刷题的时候发现有很多题会用到二分查找作为优化算法,在这里总结一下:
二分查找作为一种经典的算法,广泛应用于许多问题中,主要适用于在有序数组中查找目标值,或者解决一些优化问题。
1. 二分查找的基本概念:
二分查找是一种在 有序 数列中查找目标元素的有效方法。它通过将查找范围逐步缩小一半,从而提高查找效率。其核心思想是 将待查找区间每次分成两半,然后判断目标元素是否在这两半之一,从而逐步缩小查找的范围,直到找到目标元素或确定元素不存在。
在代码运行超时时是常用的优化手段
2. 二分查找的基本步骤:
-
初始化边界:设定查找区间的左右边界
left和right。 -
计算中间值:通过
(left + right) // 2计算中间索引。 -
比较:
- 如果中间值等于目标值,返回结果。
- 如果中间值小于目标值,更新
left = mid + 1,缩小查找区间到右半部分。 - 如果中间值大于目标值,更新
right = mid - 1,缩小查找区间到左半部分。
-
结束条件:当
left超过right时,查找失败。
3. 常见二分查找题目类型:
- 查找某个特定元素:
- 给定一个有序数组,查找目标元素是否存在。
- 应用:简单的查找问题,可以直接使用标准二分查找。
- 查找第一个或最后一个满足某个条件的元素:
- 例如,查找第一个大于或等于目标值,或者查找最后一个小于目标值。
- 技巧:在查找时,调整
left和right的更新策略,以确保找到第一个或最后一个符合条件的元素。
- 查找最小值或最大值(常用于优化问题):
- 问题:例如,给定一个函数或数列,查找最小值或最大值。
- 应用:例如求解“最小化最大值”或“最优解”类型的问题,可以通过二分查找来找到最优解。
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 # 没有找到
要注意的是边界条件,这个时候通常可以通过模拟执行步骤来看看代码是否符合预期。