一、整数二分步骤
1.找一个区间[L,R],使得答案一定在该区间中
2.找一个判断条件,使得该判断条件具有二段性,并且答案一定是该二段性的分界点
感悟:若数组中每个数都不一样,则两种模板皆可;
若是其他情况,则根据判断条件确定是哪一种模板
备注:二段性包括单调性,也就是说区间是单调的即可找到具有二段性的条件
3.分析终点M在该判断条件下是否成立,如果成立,考虑答案在哪个区间并更新区间;如果不成立,考虑答案在哪个区间并更新区间
4.如果更新方式写的是R=Mid,则不用做任何处理;如果更新方式写的L=Mid,则需要在计算Mid时加上1
二、整数二分的两类模板
1.第一类 :答案在红色区间的右端点
将[L,R]分成[L,M-1] [M,R]
while(L<R)//整数二分结束条件为L=R
{
M=(L+R+1)/2; 原因:假如L=R-1,在M=(L+R)/2的情况下,M=L,若符合M是红色,就一直死循环
if(判断条件/M在红色范围内) L=M;
else R=M-1;
}
2.第二类;答案是绿色区间的左端点
将[L,R]分成[L,M],[M+1,R]
while(L<R)
{
M=(L+R)/2;
if(判断条件/M在绿色区间) R=M;
else L=M+1;
}
三、实数二分
将区间[L,R]划分为[L,M]
while(R-L>...)//实数二分结束的条件为区间长度小于某个很小的数
{
double M=(L+R)/2;
if(判断条件) L=M;
else R=M;
}
四、整数二分与实数二分比较
1.整数二分的区间是离散的,实数二分的区间是连续的
2.整数二分可能会出现死循环,实数二分不会出现死循环
3.整数二分更新区间时,l或r更新的不同
实数二分更新区间时,l或r都更新为mid
五、时间复杂度
O(log n)