整数二分查找模板(单调一定可以二分,二分不一定要单调)

1.思路(二分查找分为查找左边界和右边界)

a为要查找的数组,x为数组要查找的数,要求要查找x的左右边界

查找左边界,也就是从左往右找到的第一个不小于x的数

①确定分界点mid,mid为区间的中点mid=l + r >> 1;

②判断a[mid]是否小于x,小于则代表答案在右边且不包含mid这个点,否则就代表答案在左边且包含mid这个点

③继续下一次查找,直到l >= r,跳出循环

查找右边界,也就是从左往右找到的第一个不大于x的数

①确定分界点mid,mid为区间的中点 mid = l + r + 1 >> 1;(加1为了防止死循环)

②判断a[mid]是否小于等于x,小于等于则代表答案在右边且包含mid这个点,否则就代表答案在左边且不包含mid这个点

③继续下一次查找,直到l >= r,跳出循环

2.代码模板
//左边界模板
//a为要查找的数组,x为数组要查找的数,要求要查找x在数组中的左边界
int bsearch_1(int[] a, int l, int r, int x){
    while (l < r) {
        int mid = l + r >> 1;
        if (a[mid] < x)  
            l = mid + 1;	//代表答案在右边且不包含mid这个点
        else    
            r = mid;		//代表答案在左边且包含mid这个点
	}
	return l;
}

//右边界模板
//a为要查找的数组,x为数组要查找的数,要求要查找x在数组中的右边界
int bsearch_2(int[] a, int l, int r, int x){
    while (l < r){
        int mid = l + r + 1 >> 1;	//加1为了防止死循环
        if (a[mid] <= x) 	
            l = mid;		//代表答案在右边且包含mid这个点
        else 
            r = mid - 1;	//代表答案在左边且不包含mid这个点
 	}
 	return l;
}
3.复杂度分析
  • 时间复杂度:O(logn)
  • 空间复杂度:O(1)
4.注意

左边界模板很容易理解,但是右边界模板还时要注意一下死循环问题,mid记得加一。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值