1.正常的整数(有序数列-》递增)的二分
> #include<iostream>
> using namespace std;
> const int N=1e5+10;
> int arr[N];
> int n;
> int binarysearch1(int x)//大于等于x的最大数字>=x first右逼近
> {
> int l=0,r=n-1;
> while(l<r)
> {
> int mid=(l+r)>>1;
> if(arr[mid]>=x)r=mid;
> else l=mid+1;
> }
> return l;
> }
> int binarysearch2(int x)//小于等于x的最小数字<=x first左逼近
> {
> int l=0,r=n-1;
> while(l<r)
> {
> int mid=(l+r+1)>>1;
> if(arr[mid]<=x)l=mid;
> else r=mid-1;
> }
> return r;
> }
> int main()
> {
> cout<<"输出数字个数:";
> cin>>n;
> puts("");
> cout<<"输出数字:";
> for(int i=0;i<n;i++)
> {
> cin>>arr[i];
> }
> int target;
> cout<<"输出目标数字:";
> cin>>target;
> int l=binarysearch1(target);
> int r=binarysearch2(target);
> if(arr[l]!=target)cout<<"-1 -1"<<endl;
> else cout<<l<<" "<<r<<endl;
> return 0;
> }
2.浮点数二分
lg:解方程
//求一个浮点数的三次方根y<=10000
#include<iostream>
#include<iomanip>
using namespace std;
double l,r;
double find(double y)
{double l=-100,r=100;while(r-l>1e-8){double mid=(l+r)/2;if(mid*mid*mid<=y)l=mid;else r=mid;}
return l;}
int main()
{double y;;cin>>y;
cout<<find(y);return 0;}
3.库函数自带的二分函数(upper_bound / lower_bound)
// 找值为 target 的位置
指针 = upper_bound(arr, arr + n, target);
arr:数组起始位置
arr+n:数组结束位置的下一个(固定写法)
target:你要找的目标数字
lower_bound → 找 第一个 ≥ 目标值 的位置
左边界
upper_bound → 找 第一个 > 目标值 的位置
右边界
样例
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int arr[N];int main()
{ int n,k;cin>>n>>k;for(int i=0;i<n;i++) cin>>arr[i];sort(arr, arr+n); // 必须排序!int maxres = 0;for(int l=0; l<n; l++){int target = arr[l] + k;// 二分找第一个大于target的位置int r = upper_bound(arr, arr+n, target) - arr;// 区间长度 = r - lmaxres = max(maxres, r - l);}cout << maxres;
}
