给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;//sizeof(nums) 不适用于 std::vector,应该使用 nums.size() 来获取向量的大小
while(left<=right){//应该使用 left <= right 因为二分查找需要包括 right 边界
int middle = left+(right-left)/2;//计算中间索引时,如果 left 和 right 的值很大,直接相加除以2可能会导致整数溢出
if(target > nums[middle]){
left = middle+1;
}
else if(target < nums[middle]){
right = middle-1;
}
else {
return middle;
}
}
return -1;
}
};
总结:
- 初始化两个指针
left
和right
,分别指向数组的起始和结束位置。 - 使用
while
循环,只要left
小于或等于right
,就继续查找。 - 在每次迭代中,计算中间索引
middle
,使用left
和right
的平均值来避免整数溢出。 - 比较
target
和nums[middle]
的值:- 如果
target
大于nums[middle]
,则将left
指针移动到middle + 1
,即在数组的右半部分继续查找。 - 如果
target
小于nums[middle]
,则将right
指针移动到middle - 1
,即在数组的左半部分继续查找。 - 如果
target
等于nums[middle]
,则返回middle
,表示找到了目标值。
- 如果
- 如果循环结束都没有找到目标值,
left
将大于right
,此时返回-1
表示未找到目标值