万事开头难
题目提供的信息有:**1.有序数组 2.元素不重复, **所以可以使用二分法。
这个题目可以用来熟悉对区间的定义,遵守循环不变量原则。
方法一:定义target在[left,right]区间,左闭右闭
当target在下标Mid的左边时,即 nums[mid] > target ,下一轮循环的又边界变为mid-1,因为mid的值已经判断过了,不需要放进下一轮。即 right = mid - 1;
int search(int* nums, int numsSize, int target){
//执行区间[left,right]
int left = 0; //数组下标从0开始
int right = numsSize - 1;
int mid = 0;
while(left <= right)
{
mid = (left + right) / 2;
//target在mid的左边,区间为[left,mid-1]
if(nums[mid] > target){
right = mid - 1;
}
//target在mid的右边,区间为[mid+1,right]
else if(nums[mid] < target){
left = mid + 1;
}
else if(nums[mid] == target){
return mid;
}
}
return -1;
}
}
方法二 ,定义区间为左闭右开。
如果目标值在mid的左边,则右边界更新为mid,因为右边为开
目标值在右边,左边界则更新为mid+1
int search(int* nums, int numsSize, int target){
int left = 0;
int right = numsSize; //此时右边界需要包含数组最后一位,因为右边为开
int mid = (left + right) / 2;
while(left < right) //查找区间为[left,right) left == right 时为空集
{
mid = left + (right - left) / 2;
//如果target在左,则区间为[left,mid)
if(nums[mid] > target){
right = mid;
}
else if(nums[mid] < target){
left = mid + 1;
}
else if(nums[mid] == target){
return mid;
}
}
return -1;
}
根据区间的定义来做边界处理
行百里者半九十