最简单的二分
最近在很多题里要自己实现二分,二分的边界条件,与判断语句里等号的取舍,L和R与mid之间的±1的取舍都很多,每个地方差一点就是一个不同的二分,在太多的复杂情况下,其实只要抓住stl二分的源码也就是*lower_bound()和 upper_boudn()*就能做到不出错。
以下是对两个函数的实现
int lower_bound(vector<int>&nums,int targrt){
int l=0,r=nums.size()-1;
while(l<r)
{
int mid=l+(r-l)/2;
int num=nums[mid];
if(nums[mid]>=target) r=mid;
else l=mid+1;
}
return l||r;
}
int upper_bound(vector<int>&nums,int targrt){
int l=0,r=nums.size()-1;
while(l<r)
{
int mid=l+(r-l)/2;
int num=nums[mid];
if(nums[mid]>target) r=mid;
else l=mid+1;
}
return l||r;
}
最后返回L或者R都是可以的,因为最后L=R了,成一个点了,我们可以看到lowerbound和upperbound的实现非常相似,仅仅是一个大于号和大于等于号的区别,这是因为这两个函数其实都是求在有相同元素的数组里,求一个下界的函数,lower是求>=target的下界,upper是求>target的下界。