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