二分模板

视频讲解链接

模板:

第一类模板:

一、区间[l,r]被划分为[l,mid]和[mid+1,r]时使用。

int bsearch_1(int l,int r)
{
	while(l<r)
	{
		int mid=l+r>>1;
		if(check(mid)) r=mid;//check()判断mid是否满足性质 
		else l=mid+1;
	}
	return l;
}

第二类模板

二、区间[l,r]被划分为[l,mid-1]和[mid,r]时使用。

整数二分

int bsearch_2(int l,int r)
{
	while(l<r)
	{
		int mid=l+r+1>>1;
		if(check(mid)) l=mid;//check()判断mid是否满足性质 
		else r=mid-1;
	}
	return l;
}

在这里插入图片描述

如果数据是具有单调性,一定可以找到相应的l==r,但是这时不一定符合答案。
但是一定可以找到

### Python 实现二分法的模板代码 #### 模板一:基本二分查找 适用于在一个升序数组中找到目标值的位置。如果存在多个相同的目标值,则返回任意一个位置。 ```python def binary_search_basic(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` 此版本是最简单的二分查找实现,适合处理不重复元素的情况[^1]。 #### 模板二:左边界二分查找 用于寻找第一个等于给定值的索引。当有重复元素时,总是返回最左边的那个。 ```python def binary_search_left_bound(nums, target): left, right = 0, len(nums) while left < right: mid = (left + right) // 2 if nums[mid] >= target: right = mid else: left = mid + 1 if left == len(nums) or nums[left] != target: return -1 return left ``` 这种变体特别有用,在处理含有重复项的数据集时可以精确定位到首次出现的位置。 #### 模板三:右边界二分查找 与左侧边界的查找相反,该方法会定位到最后一次出现指定数值的地方。 ```python def binary_search_right_bound(nums, target): left, right = 0, len(nums) while left < right: mid = (left + right) // 2 if nums[mid] <= target: left = mid + 1 else: right = mid if right == 0 or nums[right - 1] != target: return -1 return right - 1 ``` 这种方法同样适用于含有多次出现同一数目的列表,能够帮助获取最后一次出现的具体下标。 以上三种不同的二分查找算法覆盖了大多数应用场景下的需求,可以根据具体问题选择合适的版本来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值