lower_bound与upper_bound

int lowerbound(int l,int r,int target){
  while(l<=r){
    int mid=(l+r)>>1;
    if(val[mid]>=target)r=mid-1;
    else l=mid+1; }
  return l;
}
int upperbound(int l,int r,int target){
  while(l<=r){
    int mid=(l+r)>>1;
    if(val[mid]>target)r=mid-1;
    else l=mid+1; }
  return l;  
}
保持目标元素在当前区间[l,r]或超尾处,这种写法关注mid位为超尾结束,所以找大于等于target的第一个元素时期望
val[mid]>=target

找大于target的第一个元素是期望

val[mid]>target
这样mid位为正确位置时必定是作为超尾被找到的。

最后只剩一个元素时,必定以l指向正确位置,r指向不正确位置结束,所以返回l

你可能感兴趣的:(lower_bound与upper_bound)