一、题目描述与要求
二、解题思路
- 定义两个指针
left
和right
,分别指向数组的起始位置和结束位置。 - 在每一次循环中,计算出中间位置
mid
,通过(right - left) / 2 + left
得到中间位置的索引。 - 获取中间位置的元素
num
。 - 将中间元素与目标值
target
进行比较:- 如果中间元素等于目标值,说明找到了目标值,返回中间位置
mid
。 - 如果中间元素大于目标值,说明目标值应该在左半部分,将右指针
right
更新为mid - 1
。 - 如果中间元素小于目标值,说明目标值应该在右半部分,将左指针
left
更新为mid + 1
。
- 如果中间元素等于目标值,说明找到了目标值,返回中间位置
- 循环继续执行,直到左指针
left
大于右指针right
,表示整个数组已经遍历完成但未找到目标元素。 - 返回 -1,表示目标元素不存在于数组中。
这种二分查找算法的时间复杂度为 O(logn),其中 n 是数组的长度。它利用了有序数组的特性,通过每次将查找范围缩小一半的方式快速定位目标值。
三、具体代码(C++)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while(left <= right){
int mid = (right - left) / 2 + left;
int num = nums[mid];
if (num == target) {
return mid;
} else if (num > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
};
这段代码是一个二分查找算法,用于在有序数组中查找目标值。算法首先定义了左指针left和右指针right,分别指向数组的首尾元素。然后通过while循环,在数组范围内进行二分查找。每次取中间元素的索引mid,并将该索引对应的值num与目标值target进行比较。如果相等,则返回该索引;如果num大于target,则说明目标值在左半部分,将right指针更新为mid-1;如果num小于target,则说明目标值在右半部分,将left指针更新为mid+1。循环直到找到目标值或者left大于right时退出循环,最后返回-1表示未找到目标值。
该算法的时间复杂度为O(logn),其中n是数组的长度。