二分写法总结 |
您所在的位置:网站首页 › 二其他写法 › 二分写法总结 |
文章目录
写在前面整数二分二分查找
二分答案二分求上界二分求下界
浮点数二分
写在前面
首先二分的思想不难,问题在于整数二分的时候如果没有处理好二分的区间,会导致死循环的情况,比如下面这种二分求上界的写法 int binarySearch(int l, int r) { while(l while(l while(l + 1 =2 { int mid = (l + r) / 2; if(check(mid)) l = mid; //检查mid是否符合题目要求 else r = mid; } return l; }循环结束后区间大小就是1,即 [l, l+1),最终答案就是l 但是这样的写法需要注意以下3点: 初始二分的潜在的答案区间的右端点r要设置成比最大可能答案大,因为r不会被访问到还是 l + r 可能溢出如果题目说了可能没有答案,最后需要检查下 l,因为可能二分的区间里没有答案,每次循环都是 r = mid,最终的l没有被检查过 二分求下界当我们设置二分潜在的答案区间为左开右闭的时候,即 (l, r],最终得到的 r 就是答案的下界,因为这时候 r 的左侧答案都已经不符合要求,r必定是答案中最小的了 int lowerBound(int l, int r) { while(l + 1 =2 { int mid = (l + r) / 2; if(check(mid)) r = mid; //检查mid是否符合题目要求 else l = mid; } return r; }同样的我们也需要注意以下三点: 初始二分的潜在的答案区间的左端点l要设置成比最小可能答案大小,因为l不会被访问到还是 l + r 可能溢出如果题目说了可能没有答案,最后需要检查下 r,因为可能二分的区间里没有答案,每次循环都是 l = mid,最终的r没有被检查过 浮点数二分浮点数二分基本不会有什么问题,因为不会有整数二分取整没取好导致死循环的问题 有两种写法: 以循环次数为循环终止条件 for(int i = 0; i mid = (l + r) / 2; //检查mid }比较推荐第一种写法,因为第二种如果精度设置过小,加上浮点数的精度问题还是可能死循环 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |