思路分析:
- 首先,通过设置左右边界
left
和right
来定义搜索范围,初始时左边界为 0,右边界为数组的最后一个索引。 - 使用
while
循环,当左边界小于等于右边界时,进行二分查找。 - 在循环中,计算当前的中间索引
mid
。 - 判断中间元素与目标值的关系:
- 如果中间元素大于目标值,则说明目标值在左半部分,更新右边界为
mid - 1
。 - 如果中间元素小于目标值,则说明目标值在右半部分,更新左边界为
mid + 1
。 - 如果中间元素等于目标值,则找到目标,返回中间索引。
- 如果中间元素大于目标值,则说明目标值在左半部分,更新右边界为
- 若循环结束仍未找到目标值,则返回 -1,表示未找到目标。
这个算法的时间复杂度为 O(log n),其中 n 为数组的大小,因为每一步都将搜索范围缩小一半。
class Solution {
public:
// 二分查找函数
int search(vector<int>& nums, int target) {
// 初始化左右边界
int left = 0, right = nums.size() - 1;
// 当左边界小于等于右边界时进行查找
while (left <= right) {
// 计算中间索引
int mid = (left + right) / 2;
// 如果中间元素大于目标值,则在左半部分继续查找
if (nums[mid] > target)
right = mid - 1;
// 如果中间元素小于目标值,则在右半部分继续查找
else if (nums[mid] < target)
left = mid + 1;
// 如果中间元素等于目标值,则找到目标,返回中间索引
else
return mid;
}
// 若循环结束仍未找到目标值,则返回 -1 表示未找到
return -1;
}
};