intbsearch_1(int l,int r){//第二步:递归处理子问题,用while循环来实现while(l < r){//第一步:分解成子问题,这是二分的核心--范围减半int mid = l + r >>1;if(check(mid)) r = mid;//向左边找 //if判断mid是否满足性质,注意该性质会划分数组的右边部分else l = mid +1;//向右边找}//第三步:合并子问题.对二分算法来说,不需要这一步return l;//l就是寻找的右分界点,如果数组中没有要找的点,l的值就是r,但这是一个错误答案}
左边界模板
intbsearch_2(int l,int r){while(l < r){int mid = l + r +1>>1;// mid 向上取整if(check(mid)) l = mid;else r = mid -1;}return l;}
2. 浮点数二分
浮点数二分算法和整数的两种算法一摸一样,只不过不需要考虑向上取整还是向下取整,以及边界处理
右边界模板
doublebsearch_3(double l,double r){while(r - l > 精度){double mid =(l + r)/2;//这里不需要考虑取整,因为是浮点数if(check(mid)) r = mid;//这里需不需要考虑 +1 -1 之类的,因为是浮点数else l = mid;}return l;}
左边界模板
doublebsearch_4(double l,double r){while(r - l > 精度){double mid =(l + r)/2;if(check(mid)) l = mid;//只有这两个地方与上面的模板相反,其余都一样else r = mid;}return l;}