二分算法(持续更新)

本文介绍了二分算法在处理有序序列中的应用,包括查找满足特定条件的元素位置,如存在性、第一个满足条件的位置和最后一个满足条件的位置,并强调了在不同情况下的处理要点。此外,还探讨了二分法的拓展用法,如快速幂运算和利用函数增减性解决问题,总结了在增函数和减函数场景下如何选择正确的搜索方向。
摘要由CSDN通过智能技术生成
二分算法——有序序列

二分法可以作为某几类问题的通用解法:

  1. 有序序列中是否存在满足某条件的元素;
  2. 有序序列中第一个满足某条件的元素的位置;
  3. 有序序列中最后一个满足某条件的元素的位置。

1. 有序序列中是否存在满足某条件的元素:
eg. 查找一个严格递增序列中是否存在给定的数 x,存在返回下标序号,不存在返回 -1

/*left为数组最低位,right为数组最高位*/
int BinarySearch(int A[], int left, int right, int x)
{
   
	int mid;
	while(left <= right) // 当查找存在与否时,需要考虑left=right情况
	{
   
		// mid = (left + right) / 2; // 存在整型数溢出的危险 
		mid = left + (right - left) / 2;
		if(x == A[mid])
		{
   
			return mid;
		}
		else if(x < A[mid])
		{
   
			right = mid - 1;
		}
		else 
		{
   
			left = mid + 1;
		}
	}
	return -1;
}

2. 有序序列中第一个满足某条件的元素的位置:
求出序列中第一个大于等于x的元素位置L,以及第一个大于x的元素位置R,x在序列中的存在区间就是 [L,R)。
eg1. 查找一个非严格递增序列中,第一个大于等于x的元素位置

/*left为数组最低位,right为数组最高位n+1*/
int lower_bound(int A[], int left, int right, int x)
{
   
	int mid;
	while(left < right) // 必定有返回值,则left==right时,夹出来的即为结果
	{
   
		mid = left 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值