二分查找三种模板

前两种输出l或r都可以

右边界合法

int l = 0, r = n - 1;
while (l < r) {
    int mid = l + r >> 1;
    if (a[mid] < x)  l = mid + 1;
    else    r = mid;
}

左边界合法

int l = 0, r = n - 1;
while (l < r)
 {
        int mid = l + r + 1 >> 1;//注意加1防止死循环
        if (a[mid] <= x) l = mid;
        else r = mid - 1;
 }

double类型
例题:充电宝

while(r-l>1e-5) {
		double mid=(l+r)/2;
		if(check(mid))l=mid;
		else r=mid;
	}
	cout<<r; //结果输出r

你可能感兴趣的:(二分查找,数据结构)