a[]为递增序列,x为欲查询得数,函数返回第一个大于x得元素的位置
二分上下界为左闭右闭的【left,right】,传入的初值为【0,n】(取n是因为可能数列中所有数都比x小)
int upper_bound(int a[], int left, int right, int x)
{
int mid;//mid为中点
while(left < right)
{
mid = left + (right - left)/2;
if(a[mid] <= x)
{
left = mid + 1;
} else
{
right = mid;
}
}
//这时候left = right 都一样
return left
}
求出序列中第一个大于等于X的元素的位置L,用二分
int lower_bound(int a[], int left, int right, int x)
{
int mid;//mid为中点
while(left < right)
//因为这个问题不是判断target是否存在,而是
//找到他的位置,即使这个元素不存在于这个数组,但是我们还是会假设他存在
//所以我们可以认为他存在,这个题就是找到他的位置,因此只要left ==right
//我们就找到了位置;而最基础的二分法,判断target是否存在的那种,是left<=right,因为这样如果出去了left>right ,我们就可以直接判断不存在
{
mid = left + (right - left)/2;
if(a[mid] < x)
{
left = mid + 1;
} else//因为要找的是第一个大于等于的位置,所以大于等于是一种情况
{
right = mid;
}
}
//这时候left = right 都一样
return left
}