二分法的边界确定

二分法的边界确定

二分法是非常重要的基础算法,但是经常就是一看就会,一写就废。

其实在写二分法的时候,很多时候都是卡在了边界的确定的问题上。在确定边界的时候,要仔细考虑区间是如何定义的,以及搜索的目标与区间的关系,这样边界的确定就能一目了然。

二分查找涉及的很多的边界条件,逻辑都比较简单。例如 while(left < right)while(left <= right)right = middleright = middle - 1

  • while(left < right)while(left <= right)表示[left,right)[left,right]这样的两种搜索区间
  • right = middle表示下一次搜索包括middle,而right = middle - 1表示下一次搜索不包括middle

例如LeetCode 34、在排序数组中查找元素的第一个和最后一个位置需要使用二分法分别找出左边界和右边界,这个题目就是非常经典的二分法里面的边界问题。

左边界

//寻找左边界
int left=0;
int right=nums.size()-1;
while(left<=right){		//在闭区间[left,right]内搜索
	int mid=(right-left)/2+left;	
	if(nums[mid]<target)	//寻找左边界,在num[mid]小于target的时候,num[mid]就一定不是左边界
		left=mid+1;		//因此这里就给left赋值mid+1
	else
		right=mid-1;
}
int leftBoard=nums[left]==target?left:-1;

右边界

//寻找右边界
int left=0;
int right=nums.size()-1;
while(left<=right){		//在闭区间[left,right]内搜索
	int mid=(right-left)/2+left;
	if(nums[mid]>target)		//寻找右边界,在num[mid]大于target的时候,num[mid]就一定不是右边界
		right=mid-1;		//因此这里就给right赋值mid-1
	else
		left=mid+1;
}
int rightBoard=nums[right]==target?right:-1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值