二分
用处
做题的时候,有些题目写暴力会TLE
,这是我们就需要优化。
做法
例如下面这道题
现在有一根1000米的电线坏了,让你找出坏掉的部分。
我们如果一个一个的尝试时间复杂度是
O
(
1000
)
O(1000)
O(1000),如果再长一点,长度是
1
0
9
10^9
109,时间复杂度就是
O
(
1
0
9
)
O(10^9)
O(109),这就容易超时。
那么我们可以先看前500米,看哪边是坏的,例如右边是坏的,那么我们再看501米~750米,看那边是坏的……直到找到结果。
代码实现
二分部分
整数
二分查找
int l=1,r=n,mid;//mid为二分的点
while(l<=r){
mid=(l+r)/2;
if(check(mid)){//check为检查这个点符合要求不
l=mid-1;
}else{
r=mid+1//r和l可以换位置
}
}
二分答案
int l=1,r=n,mid,ans;//mid为二分的点,ans记录答案
while(l<=r){
mid=(l+r)/2;
if(check(mid)){//check为检查这个点符合要求不
l=mid-1;
ans=mid;
}else{
r=mid+1//r和l可以换位置
}
}