1.一般的二分模板有两套,假设a数组是一个上升数组,待查找的为x。
//查找第一个出现的x,如果没有x则输出待插入的位置。
int search(int l,int r,int x)
{
while(l<r)
{
int mid = (l+r) / 2;
if(a[mid]>=x) r = mid;
else l = mid+1;
}
if(a[l]<x) return l+1;
else return l;
}
//在数组中查找最后出现出现的x,找到就返回x的位置,没有找到就返回x应该插入的位置。
int search1(int l,int r,int x)
{
while(l<r)
{
int mid = (l+r+1) / 2;
if(a[mid]<=x) l = mid;
else r = mid-1;
}
if(a[l] < x) return l+1;
else return l;
}
2.关于lower_bound函数和upper_bound函数
lower_bound函数是返回有序数组中第一个大于等于X的指针,不存在就返回end;
int a[] = {1,2,3,3,5};
lower_bound(a,a+5,3)-a得到2。
upper_bound函数返回有序数组中第一个大于x的指针
upper_bound(a,a+5,3)-a返回4。