二分算法可以分为二分查找和二分答案。
以在一个升序数组中查找一个数为例。它每次考察数组当前部分的中间元素,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果中间元素大于所查找的值同理,只需到左侧查找。
首先明确二分查找与二分答案有何区别?
二分查找:在一个已知的有序数据集上进行二分地查找
二分答案:答案有一个区间,在这个区间中二分,直到找到最优答案
敲黑板——重点
- 最重要的就是明白什么时候使用二分;以及二分的边界判断;
- 什么时候使用二分?
二分分为二分查找、二分答案这两类- 二分查找:在一个有序的数据集上进行二分地查找 根据和目标值(需要查找的x)进行对比 O(log n)
知道目标 然后在一个有序区间中 查找 - 二分答案:答案有一个区间,我们在这个区间中进行二分,直到找到最优答案(而往往这个答案和一个变量有关系 他们之间存在单调性,这样在check()之后才知道,往左还是 往右进行下一次二分);
知道目标在一个区间内 然后目标有一个判断是否符合的变量 每次二分之后都需要和变量比较 然后才会知道下一次往左 还是 往右进行二分 最后推出最优答案;
- 二分查找:在一个有序的数据集上进行二分地查找 根据和目标值(需要查找的x)进行对比 O(log n)
- 二分基础模板
往左 往右如何写边界——核心:下一次二分包含正确值
while(l<r){
int mid = l+r >>1;
if(check(mid)) r = mid;//check= true的时候 往左继续二分
else l = mid +1;
}
while(l<r){
int mid = l+r+1>>1;
if(check(mid)) l=mid;
else r = mid - 1;
}