二分算法介绍
二分算法就是找到满足条件的边界,并且不断缩小范围直到找到满足条件的数据为止。
注意:使用二分算法并不需要满足单调性,二分并不是按照大小来分的,只要满足某个条件都可以用来二分。
二分算法和二查找
二分算法是用来查找满足条件的区间和位置的,二分查找是找到一个特定的数值;
二分算法的运算逻辑
主要是找到两个边界点,再一直更新区间,直到找符合条件的区间就可以停止了。
边界问题:1. 主要是存在左右边界点的边界问题,处理不好很有可能就会陷入到死循环之中;
边界问题描述:① 当边界点mid在右边的时候,就会发生边界问题,即如果不满足不满足的条件就会使得,左边界点在右边,满足满足条件的时候同时遍历到最后一个的前一个,l=r-1,mid = l + r >> 1,即等同于mid = r + r - 1,因为是语言向下取整的,所以mid还是等于r-1,就会一直陷入死循环,所以当左边界在右边的时候,就需要mid + 1才可以;即 mid = l + r + 1 >> 1;就可以避免死循环的情况。
②当右边界在左边的时候就不需要进行处理,因为当r遍历到最前面的数的后一个时,r = l + 1,mid = l + l + 1,向下取整的话就是l,左边界和右边界就重合了,所以并不需要进行特殊处理。
代码模板
当寻找不满足判断条件的二分的模板(即右边界点左边)
void bsearch(int l,int r){
while(l < r){
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
当寻找满足判断条件的二分的模板(即左边界点在右边的时候)
void bsearch(int l,int r){
int mid = l + r + 1 >> 1;
while(l < r){
if(check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
结果返回的情况判断
二分算法是一定有返回值的,因为两个指针一定会相遇;
如果放回不存在的情况,并不是返回结果值,而是判断这个返回值是否满足了题目需要,符合题目的条件就返回这个值,没有符合条件就返回题目要求的结果。
二分算法返回l和r都是可以的,因为两个最后的结果都是一样的,会碰到一起然后就会停止。