一、二分
二分法,在一个单调有序的集合或函数中查找一个解,每次分为左右两部分,判断解在那个部分并调整上下界,直到找到目标元素,每次二分都将舍弃一般的查找空间,因此效率很高。
二分常见模型
1、二分答案
最小值最大(或是最大值最小)问题,这类双最值问题常常选用二分法求解,也就是确定答案后,配合贪心,DP等其他算法检验这个答案是否合理,将最优化问题转化为判定性问题。例如,将长度为n的序列ai分为最多m个连续段,求所有分法中每段和的最大值的最小是多少?
2、二分查找
用具有单调性的布尔表达式求解分界点,比如在有序数列中求数字x的排名。
3、代替三分
有时,对于一些单峰函数,我们可以用二分导函数的方法求解函数的极值,这时通常将函数的定义域定义为整数域求解比较方便,此时dx可以直接去整数1。
二分写法
参考博客:传送门
版本1
当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。
C++ 代码模板:
1 int bsearch_1(int l, int r) 2 { 3 while (l < r) 4 { 5 int mid = l + r >> 1; 6 if (check(mid)) r = mid; 7 else l = mid + 1; 8 } 9 return l; 10 }