二分查找——存在重复寻找第一个和最后一个

二分查找

算法思想

前提序列已经排好序了,每次计算中间值,根据中间结果确定下次选择左右区间的哪个区间,逐渐逼近最终结果,每次缩小一半的范围,因此二分的时间复杂度为O( logn )

类别

较常用的为左闭右闭和左闭右开两种,当存在重复元素时涉及到查找第一个和最后一个符合条件的,下面分别进行介绍。

左闭右闭

int left = 0, right = nums.size() - 1;

查找第一个:
等于target时向左收缩,即等于target时需要right = mid - 1;

int binSearch(vector<int> nums, int target)
{
	int left = 0, right = nums.size() - 1;
	while (left <= right)
	{
		int mid = left + ((right - left) >> 1);//移位更快
		if(target <= nums[mid])
			right = mid - 1;
		else
			left = mid + 1;
	} 
	return left;
}

查找最后一个:
等于target时向右收缩,跳出循环时left = mid + 1,mid 为最后一个元素,所以left–;或者返回right。

int binSearch(vector<int> nums, int target)
{
	int left = 0, right = nums.size() - 1;
	while (left <= right)
	{
		int mid = left + ((right - left) >> 1);//移位更快
		if(target < nums[mid])
			right = mid - 1;
		else
			left = mid + 1;
	} 
	return left--;
}

左闭右开

int left = 0, right = nums.size() ;

查找第一个:
等于target时向左收缩

int binSearch(vector<int> nums, int target)
{
	int left = 0, right = nums.size();
	while (left < right)
	{
		int mid = left + ((right - left) >> 1);//移位更快
		if(target <= nums[mid])
			right = mid;
		else
			left = mid + 1;
	} 
	return left;
}

查找最后一个:
等于target时向右收缩,跳出循环时left = mid + 1,mid 为最后一个元素,所以left–;或者返回right。

int binSearch(vector<int> nums, int target)
{
	int left = 0, right = nums.size();
	while (left < right)
	{
		int mid = left + ((right - left) >> 1);//移位更快
		if(target < nums[mid])
			right = mid;
		else
			left = mid + 1;
	} 
	return left--;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值