打卡day1 704.二分查找

万事开头难
在这里插入图片描述
题目提供的信息有:**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;
}

根据区间的定义来做边界处理

行百里者半九十

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值