二分模板

默认数组元素是非递减的。

寻找数组中大于target的右面第一个数字的下标

int bisearch(int l , int r) { 
    //此处不加等号
	while(l < r) {
		int mid = l+r >> 1;
		if(a[mid] > target) r = mid;
		else l = mid + 1;
	}
	return l;
}

寻找数组中小于target的左面第一个数字的下标

int bisearch(int l, int r) { 
	while(l < r) {
		int mid = l+r+1 >> 1;
		if(a[mid] < target) l = mid;
		else r = mid - 1;
	}
	return l;
}

寻找数组中大于等于target的最左面的数字的下标

	while(l < r) {
		int mid = l+r >> 1;
		if(a[mid] >= t) r = mid;
		else l = mid + 1;
	}
	return l;

寻找数组中小于等于target的最右面的数字的下标

int bisearch_2(int l, int r) {
	while(l < r) {
		int mid = l+r+1 >> 1;
		if(a[mid] <= t) l = mid;
		else r = mid - 1;
	}
	return l;
}

从上面可以总结出:

对于while里面的条件,可以总是设置为l<r

对于mid,有两种选择:

  1. mid=(l+r)>>1 配合 l=mid+1,r=mid

    这种情况下最终结果会因为mid的选择偏向左边

  2. mid=(l+r+1)>>1配合l=mid,r=mid-1

    这种情况下最终结果会因为mid的选择偏向右边

posted @ 2022-04-12 21:37  曾凡璐  阅读(26)  评论(0)    收藏  举报