文章目录
- [1. 特点](#1. 特点)
- [2. 学习中的侧重点](#2. 学习中的侧重点)
-
- [2.1 算法原理](#2.1 算法原理)
- [2.2 模板](#2.2 模板)
-
- [2.2.1 朴素二分模板(easy-->有局限)](#2.2.1 朴素二分模板(easy-->有局限))
- [2.2.2 查找左边界的二分模板](#2.2.2 查找左边界的二分模板)
- [2.2.3 查找右边界的二分模板](#2.2.3 查找右边界的二分模板)
1. 特点
二分算法是最恶心,细节最多,最容易写出死循环的算法====但是,一旦掌握了之后,二分算法就是最简单的算法。
其实并不是一定要二分,三分,四分也都可以,但是根据概率学中的求期望数学中可知,二分是效率最高的。
如果是三分的话,我们就像是在赌,如果赌对了,那么就直接舍弃掉三分之二的数据,但是如果失败了那么就只能舍弃掉三分之一的数据。
2. 学习中的侧重点
2.1 算法原理
只有在数组有序的情况下才能使用二分算法(×)。
实际情况是,只要能发现一些规律(二段性)就能使用二分算法。
2.2 模板
不要死记硬背×3!!!------>理解之后再记忆。
2.2.1 朴素二分模板(easy-->有局限)
java
while (left <= right){//条件一定是带等号的
int mid = left + ((right - left)/2);//防止溢出
if (.....){
left = mid + 1;
} else if (.....) {
right = mid - 1;
}else {
return .....;
}
}
2.2.2 查找左边界的二分模板
细节处理:
- 循环条件
left < right
- left = right的时候,就是最终结果,无需判断。
- 如果判断,就会死循环
- 求中点的操作
left + (right - left) / 2
java
while (left < right){
int mid = left + (left - right) / 2;
if (....){
left = mid + 1;
}else{
right = mid;
}
}
2.2.3 查找右边界的二分模板
细节处理:
- 循环条件
left < right
- left = right的时候,就是最终结果,无需判断。
- 如果判断,就会死循环
- 求中点的操作
left + (right - left + 1) / 2
java
while (left < right){
int mid = left + (left - right + 1) / 2;
if (....){
left = mid;
}else{
right = mid - 1;
}
}
第2和3种模板是万能模板,但是细节比较多。
记忆:当下面出现 - 1 时,上面就加 + 1