二分查找算法(Binary Search)
字数 866 2025-10-25 22:15:07
二分查找算法(Binary Search)
题目描述:给定一个升序排列的整数数组 nums 和一个目标值 target,请你找出 target 在数组中的索引位置。如果目标值不存在于数组中,返回 -1。要求算法时间复杂度为 O(log n)。
解题过程:
-
核心思想
二分查找利用数组已排序的特性,通过不断缩小搜索范围来快速定位目标值。每次比较中间元素与目标值,根据比较结果决定继续搜索左半部分或右半部分。 -
具体步骤
步骤1:初始化两个指针
- 左指针 left = 0(指向数组起始位置)
- 右指针 right = nums.length - 1(指向数组末尾位置)
步骤2:循环查找(当 left ≤ right 时)
a. 计算中间位置 mid = left + (right - left) // 2
(使用这种写法而非 (left+right)//2 可防止整数溢出)
b. 比较中间值与目标值:
- 如果 nums[mid] == target:找到目标,直接返回 mid
- 如果 nums[mid] < target:说明目标在右侧,将 left 设为 mid + 1
- 如果 nums[mid] > target:说明目标在左侧,将 right 设为 mid - 1
步骤3:循环结束处理
如果循环结束仍未找到目标值,说明目标不存在,返回 -1
-
执行示例
以 nums = [1, 3, 5, 7, 9], target = 7 为例:
第一次查找:left=0, right=4 → mid=2 → nums[2]=5 < 7 → left=3
第二次查找:left=3, right=4 → mid=3 → nums[3]=7 == 7 → 返回索引3 -
关键要点
- 必须确保输入数组是有序的
- 每次比较可排除一半的搜索空间
- 时间复杂度为 O(log n),空间复杂度为 O(1)
- 边界情况处理
- 空数组:直接返回 -1
- 单个元素数组:直接比较该元素
- 目标值小于最小值或大于最大值:可通过首尾判断快速确定不存在