1.二分查找
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
- 你可以假设
nums
中的所有元素是不重复的。 n
将在[1, 10000]
之间。nums
的每个元素都将在[-9999, 9999]
之间。
思路
采用二分查找,选择中间值middle比较,若target > middle,则说明target在右侧重新选取middle,
再次比较.若target在nums中不存在,即比较到只有最后一个元素时不一致,则target不存在,返回-1
采用while middle ≠ target循环,在添加一个判定是否只有一个元素的情况.
C++代码
int left = 0;
int right = nums.size()-1;
int middle = (left + right)/2;
while (nums[middle] != target)
{
if (right-left <= 1) //需逐一比较
{
if (nums[left] == target) return left;
if (nums[right] == target) return right;
return -1;
}
if (nums[middle] > target) //说明target在左侧
{
right = middle;//修改右侧边界
middle = (right + left)/2;//修改中间值
}
if (nums[middle] < target)
{
left = middle;//修改左侧边界
middle =(right + left)/2;
}
}
return middle;
- 这里要特别考虑当left-right=1即只有两个数字的情况,只能逐一比较,用middle判断不出来并不说明数值查找不到。