1 二分的特点
- 确定一个区间,使得目标值一定在区间内。
- 找到一个性质,使其满足:性质有二段性(一边满足性质,一边不满足性质)、答案是二段性的分界点。
2 二分模板
2.1 整数二分
整数二分一般有两种情况,一种是查找满足条件的数的下界位置,称为lower_bound,另一种是求满足条件的数的上界位置,称为upper_bound。2.1.1 查找满足条件的数的下界位置
int n;//元素总个数int num[LENGTH];int search_lower_bound(int sea_n){int l=0,r=n-1;int mid;while(l<r){mid=(l+r)/2;if(num[mid]>=sea_n)//符合条件r=mid;elsel=mid+1;}//while结束时l=rif(num[l]==sea_n)return l;//找到了elsereturn -1;//没找到}
2.1.2 查找满足条件的数的上界位置
int n;//元素总个数int num[LENGTH];int search_upper_bound(int sea_n){int l=0,r=n-1;int mid;while(l<r){mid=(L+r+1)/2;//避免死循环,所以加一,从而取上界if(num[mid]<=sea_n)//符合条件l=mid;elser=mid-1;}//while结束时l=rif(num[l]==sea_n)return l;//找到了elsereturn -1;//没找到}
2.2 实数二分
double binary_search_ss(double n){double l=-10000,r=10000;double mid;while((r-l)>1e-6)//要比要求的精度小两个数量级{mid=(l+r)/2;if(猜大了)r=mid;elsel=mid;}return mid;}
