没有Bug的二分法

每一个学过数据结构和算法的人都知道二分法,对于二分法的定义和思想了然于胸,然而,真正能够在很短的时间里面写出没有bug的二分法是不容易的一件事。想要编写没有bug的二分查找,最重要的亮点就是判断循环体是否终止的语句以及边界值left,right和区间值这三个地方要保持一致。下面记录二分法的两个不同的边界写法,千万不要搞混了。
写法一:

int BinarySearch(vector<int>& nums, int value) {
    int len = nums.size();
    int left = 0;
    int right = len - 1;
    while (left <= right) {
        int middle = left + ((right - left) >> 1);
        if (nums[middle] > value) {
            right = middle - 1;
        } else if (nums[middle] < value) {
            left = middle + 1;
        } else {
            return middle;
        }
    }
    return -1;
}

写法二:

int BinarySearch(vector<int>& nums, int value) {
    int len = nums.size();
    int left = 0;
    int right = len; // 关键点
    while (left < right) { // 终止条件修改
        int middle = left + ((right - left) >> 1);
        if (nums[middle] > value) {
            right = middle; // 此处也要修改
        } else if (nums[middle] < value) {
            left = middle + 1;
        } else {
            return middle;
        }
    }
    return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值