返回
二分查找——LeetCode
见解分享
2023-09-28 05:41:31
导言
在算法的世界中,二分查找算法以其效率和通用性而著称。它是一种搜索算法,专门用于在有序数组中快速查找目标元素。其核心思想是通过不断地将搜索范围减半,从而以对数时间复杂度(O(log n))找到目标元素。
二分查找的运作原理
假设我们有一个有序数组 [1, 3, 5, 7, 9, 11, 13, 15, 17, 19],我们要查找其中的元素 13。二分查找算法如下运作:
- 计算中点索引: 计算数组的中间索引,即 (0 + 9) / 2 = 4。
- 比较中点元素: 将中点元素(数组中的第 4 个元素,即 9)与目标元素(13)进行比较。
- 缩小搜索范围: 如果中点元素小于目标元素,则目标元素一定在中点索引右侧,因此将搜索范围缩小为 [5, 7, 9, 11, 13, 15, 17, 19]。
- 重复步骤 1-3: 重复计算中点索引、比较中点元素和缩小搜索范围的步骤,直到找到目标元素或搜索范围缩小为 0。
代码示例
以下是用 Python 实现的二分查找算法:
def binary_search(array, target):
low = 0
high = len(array) - 1
while low <= high:
mid = (low + high) // 2
if array[mid] == target:
return mid
elif array[mid] < target:
low = mid + 1
else:
high = mid - 1
return -1
LeetCode 问题应用
LeetCode 540:只含单一元素的排序数组
给定一个只含单一元素的排序数组,求这个元素。
输入:nums = [1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10]
输出:1
def single_element_in_sorted_array(nums):
low, high = 0, len(nums) - 1
while low < high:
mid = (low + high) // 2
if nums[mid] == nums[mid + 1]:
low = mid + 2
elif nums[mid] == nums[mid - 1]:
high = mid - 2
else:
return nums[mid]
return nums[low]
扩展应用
二分查找算法不仅适用于有序数组,还可以应用于其他场景,如:
- 查找旋转有序数组中的最小元素
- 在二维数组中查找元素
- 在平衡二叉树中查找元素
- 在字符串中查找子串
总结
二分查找算法是一种强大的搜索算法,以其效率和通用性而著称。它适用于有序数据,可以通过不断地缩小搜索范围来快速找到目标元素。在 LeetCode 等算法平台上,二分查找算法经常用于解决各种搜索问题。通过掌握二分查找的原理和应用,你可以显著提升你的算法技能。