二分查找算法(左闭右开区间)

本文探讨了二分查找算法在左闭右开区间的应用,指出该算法虽简单却易出错,主要问题涉及中间区间的溢出、区间选择和死循环。文章介绍了64种二分查找形式,并特别关注了左闭右开区间,将其分为三部分进行阐述,同时也提及了左闭右闭区间的情况,并结合表驱动法的阶梯表法展示了二分查找的实际应用。
摘要由CSDN通过智能技术生成

二分查找算法是一个基本但用处十分广泛的算法,但要写出一个没有bug的二分查找算法也不容易,《编程珠玑》一书中提到仅有百分之十的人可以第一次就写出没有bug的二分查找算法,主要原因在于寻找中间区间时数据有可能溢出,以及区间的选择不正确导致死循环,数组越界等等。二分查找算法一共有64种形式,由于在计算机中左闭右开区间非常普遍(比如迭代器中就是使用左闭右开区间),我将划分范围划分为左闭右开区间。如下图所示
(1)左闭右开区间
这里写图片描述

也就是将区间分为三部分:
这里写图片描述

int searchInsert(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size();     //这里指向最后一个元素的后一个元素
        int mid = 0;
        while (left < right) {
            mid = left + ((right - left) >> 1);
            if(target < nums.at(mid))               //如果小于num[mid],那么target在区间[left,mid)之间
                right = mid;
            else if (target > nums.at(mid))    //如果大于num[mid],那么target在区间[mid+1,right)之间
                left = mid + 1;
            else                                                //如果等于num[mid],那么直接返回
                return mid;
        }
        return left;                                       //如果未找到则返回最接近的位置
    }

对应的一种在算法中提到的对称区间的情况,和上面的思想一样,只不过区间换成了左闭右闭区间:
(2)左闭右闭区间:
这里写图片描述

int searchInsert(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值