二分
二分一直感觉是一个很搞怪的东西,每次分的时候都要考虑很久,有时候还会出现死循环,为了避免这些问题,我看了很多大佬的博客,发现了一套可以适用一切情况的二分模板。
以[l,mid],[mid+1,r]二分的模板
int l1=0,r1=7;
while(l1<r1) // 以[l,mid] [mid+1,r] 划分
{
int mid=l1+r1>>1;
if(a[mid]>=3) r1=mid; //if判断中的是二分条件。
else l1=mid+1;
}
cout<<l1<<endl;
以[l,mid-1],[mid,r]二分的模板
int l2=0,r2=7;
while(l2<r2)
{
int mid=l2+r2+1>>1;
if(a[mid]<=3) l2=mid;
else r2=mid-1;
}
cout<<l2<<endl;
上完整代码
#include<iostream>
using namespace std;
int a[10]={1,2,2,3,3,3,3,4};
int main()
{
//用二分求3的下标最小值
int l1=0,r1=7;
while(l1<r1)
{
int mid=l1+r1>>1;
if(a[mid]>=3) r1=mid;
else l1=mid+1;
}
cout<<l1<<endl;
//用二分求3的下标最大值
int l2=0,r2=7;
while(l2<r2)
{
int mid=l2+r2+1>>1;
if(a[mid]<=3) l2=mid;
else r2=mid-1;
}
cout<<l2<<endl;
return 0;
}
结果:
3
6
刚好是对应的下标最小值和最大值。