一、二分适用范围
-
单调
-
有界
-
有单独解
二、二分复杂度分析
-
时间复杂度
每次排除1/2的错误范围,所以时间复杂度由O(n)->O(log n)
-
空间复杂度
O(1)
三、二分模板
int l,r,mid;
l=-1,r=N; //N为给出单调区间元素的个数
while(l+1!=r){
mid=(l+r)>>1;
if(check(mid)){
l=mid;
}else{
r=mid;
}
cout<<r<<endl;//根据实际情况判断输出r还是l.
cout<<l<<endl;
四、二分简单例题
对于数组{-1,2,5,5,7},
//1.请找出第一个 大于等于5的位置 ans=2
//2.请找出最后一个小于5的位置 ans=1
//3.请找出最后一个大于等于5的位置 ans=3
//4.请找出第一个大于5的位置 ans=4
代码如下:
#include<bits\stdc++.h>
using namespace std;
//1.请找出第一个 大于等于5的位置 ans=2
//2.请找出最后一个小于5的位置 ans=1
//3.请找出最后一个大于等于5的位置 ans=3
//4.请找出第一个大于5的位置 ans=4
int main(){
int a[5]={-1,2,5,5,7};
int l=-1,r=5,mid;
while(l+1!=r){
mid=(l+r)>>1;
if(a[mid]<5){
l=mid;
}else{
r=mid;
}
}
cout<<"第一题答案:"<<r<<endl;
cout<<"第二题答案 "<<l<<endl;
l=0,r=5;//初始化l,r
while(l+1!=r){
mid=(l+r)>>1;
if(a[mid]>5){
r=mid;
}else{
l=mid;
}
}
cout<<"第三题答案"<<l<<endl;
cout<<"第四题答案"<<r<<endl;
return 0;
}
五、补充
加入单调元素中不存在左半部分(即l自始至终都为-1),例如{-1,2,5,5,7}中找出小于-1的位置。或
加入单调元素中不存在右半部分(即l自始至终都为N),例如{-1,2,5,5,7}中找出大于7的位置。
对于这两种特殊情况,我们可以在代码结尾进行if判断r和l进行解释说明。