二分法
二分法是比较简单的算法,不过容易写错。所以在这里总结一下。
必然存在的二分法
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
}