二分法

二分法是比较简单的算法,不过容易写错。所以在这里总结一下。
必然存在的二分法

int a[MAXN];
int indexOf(int l,int r,int val){
   while(l<=r){
       int mid = l+(r-l)>>1;
       if ( a[mid] == val ) return mid;
       if ( a[mid] < val ) l = mid+1;
       else r = mid-1;
   }
   return -1;
}

查找第一个比需要查找的值的前一个位置
(即:如果存在多个值,则返回最后那个相等的下标值,
如果存在1个值,则返回相等的下标值,
如果不存在,则返回最后一个比查找值小的值)

int a[MAXN];
int indexOf(int l,int r,int val){
   while(l<=r){
       int mid = l+(r-l)>>1;
       if ( a[mid] <= val ) l = mid+1;
       else r = mid-1;
   }
   return l-1;//如果 val存在 l值=mid+1 其中 a[mid] == val  
//如果是单调队例pop出,则可以直接在l下标出赋新值 pop出。
}

查找第一个比需要查找的值的前一个位置
(即:如果存在多个值,则返回第一个那个相等的下标值,
如果存在1个值,则返回相等的下标值,
如果不存在,则返回最后一个比查找值小的值)

//TODO
int a[MAXN];
int indexOf(int l,int r,int val){
   while(l<=r){
       int mid = l+(r-l)>>1;
       if ( a[mid] >= val ) r = mid-1;
       else l = mid+1;
   }
   return r+1;//如果 val存在 r值=mid-1 其中 a[mid] == val
}
posted @ 2021-11-02 17:39  传说中的水牛  阅读(140)  评论(0编辑  收藏  举报