二分查找边界问题

二分查找思路简单,复杂点在边界的处理上

思路1:在循环体中查找元素

void search(int *nums, int left, int right, int target){
    // 在[left,right]区间里进行查找
    while(left<=right){
        int mid=left+(right-left)/2;
        if(nums[mid]==target){
            return mid;
        }
        else if(nums[mid]<target){
            right=mid-1; // 下一轮搜索区间[left, mid-1]
        }
        else{
            left=mid+1; // [mid+1, right]
        }
    }
    return -1;
}

这种写法是在循环体内部进行目标元素的查找。

思路2:循环体中逼近目标元素

// 选择中位数时选择上/下取整
void search(int *nums, int left, int right, int target){
    // 在[left,right]区间里进行查找
    while(left<right){
        int mid=left+(right-left)/2; //向下取整
        if(nums[mid]<target){
            left=mid+1; // [mid+1, right]
        }
        else{
            right=mid; // 下一轮搜索区间[left, mid]
        }
    }
    if(nums[left]==target)return left;
    else return -1;
}

void search(int *nums, int left, int right, int target){
    // 在[left,right]区间里进行查找
    while(left<right){
        int mid=left+(right-left+1)/2; //向上取整
        if(nums[mid]<target){
            right=mid-1; // 下一轮搜索区间[left, mid-1]
        }
        else{
            left=mid; // [mid+1, right]
        }
    }
    if(nums[left]==target)return left;
    else return -1;
}

思路二中 循环体退出时,判断left下标元素是否符合目标元素

在使用思路二时,在取mid=left+(right-left)/2 向下取整时, 如果后续left=mid的话,当只有2个元素时会陷入死循环,需要注意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值