整数二分
- 确定一个区间,使得目标值一定在区间中,通过目标值将区间分成两段
- 找一个性质满足:
①性质具有二段性:每一个数都能被判断,一段满足,一半不满足,两段无缝衔接。
②目标值在两段中间点 -
两个问题
①前一段右端点
②后一段左端点 -
前一段右端点
将[L,R]分成[L,M-1]和[M.R]
//只需关注R= M还是L=M
while(L<R)
M=(L+R+1)/2;
if(m在左段) L=M;//M在左段说明目标值在右侧区间,故令L=M 使程序在右侧继续进行二分有L=M就要补加1
else R=M-1;
* 后一段左端点
将[L,R]分成[L,M]和[M+1.R]
while(L<R)
M=(L+R)/2;
if(m在左段) R=M;
else L=M+1;
*如果每个数字都一样 则两种写法都可用
实数二分
- 可以严格缩小一半,故只需令L\R=M即可
- 判断条件:R-L<1e-6;
- 有单调性一定可以二分 可以二分不一定有单调性