几种不同的二分查找

本文提供了六种实用的二分搜索实现模板,包括查找特定元素的最小和最大位置、寻找小于或大于给定值的最大和最小位置等。这些模板适用于算法竞赛及编程实践,能够帮助快速解决问题。

今天多校又卡在找下标上了,队友贡献了一发自己写的二分板子,感觉很好用。保存下来。

/*
几种二分方法整理
元素可以重复 
*/

//lower_bound(num, num+size, x)-num:大于等于x的第一个数的下标 
//upper_bound(num, num+size, x)-num:大于x的第一个数的下标 

//1.求等于x的最小的index,不存在返回-1
int binary (int *num, int start, int end, int x) {
	int l = start, r = end, ans=-1;
	while(l <= r) {
		int mid = (l+r) >> 1;
		if(num[mid] == x) {
			ans = mid;
			r = mid - 1;
		}
		else if(num[mid] > x)
			r = mid - 1;
		else
			l = mid + 1;
	}
	return ans;
}

//2.求等于x的最大的index,不存在返回-1
int binary (int *num, int start, int end, int x) {
	int l = start, r = end, ans=-1;
	while(l <= r) {
		int mid = (l+r) >> 1;
		if(num[mid] == x) {
			ans = mid;
			l = mid + 1;
		}
		else if(num[mid] > x)
			r = mid - 1;
		else
			l = mid + 1;
	}
	return ans;
}

//3.求小于x的最大的index
int binary (int *num, int start, int end, int x) {
	int l = start, r = end;
	while(l <= r) {
		int mid = (l+r) >> 1;
		if(num[mid] >= x)
			r = mid - 1;
		else
			l = mid + 1;
	}
	return r;
}

//4.求大于x的最小的index
int binary (int *num, int start, int end, int x) {
	int l = start, r = end;
	while(l <= r) {
		int mid = (l+r) >> 1;
		if(num[mid] <= x)
			l = mid + 1;
		else
			r = mid - 1;
	}
	return l;
}

//5.求大于等于x的最小的index
int binary (int *num, int start, int end, int x) {
	int l = start, r = end;
	while(l <= r) {
		int mid = (l+r) >> 1;
		if(num[mid] >= x)
			r = mid - 1;
		else
			l = mid + 1;
	}
	return l;
}

//6.求小于等于x的最大的index
int binary (int *num, int start, int end, int x) {
	int l = start, r = end;
	while(l <= r) {
		int mid = (l+r) >> 1;
		if(num[mid] <= x)
			l = mid + 1;
		else
			r = mid - 1;
	}
	return r;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值