ACM题解Day2|二分查找总结

本文详细介绍了如何在C++中使用二分查找算法,包括整数、浮点数版本的实现以及二分查找在求解最大花束问题中的应用,同时讨论了左开右闭区间的特点和区别。
摘要由CSDN通过智能技术生成

二分查找

可以使用C++的库函数:

binary_search(arr.begin(),arr.end(),target) 用于判断元素是否在数组内

lower_bound(arr.begin(),arr.end(),target) 用于查找大于等于该元素的第一个元素,返回迭代器 减去 arr.begin() 即是数组下标

同理 upper_bound(arr.begin(),arr.end(),target) 查找第一个大于 target 的元素同样返回迭代器同样操作

正常二分查找 (整数二分)

int l = 0, r = n - 1;
while (l < r) {
    int mid = (r - l) / 2 + l;
    if (a[mid] > target) {
        r = mid - 1;
    } else if (a[mid] < target) {
        l = mid + 1;
    } else {
        l = mid;
        break;
    }
}
std::cout << l << std::endl;

问题二分查找的左开右闭, 与闭区间的区别?

二分答案

模版

ll l = 0, r = LLONG_MAX;
whil(l + 1 < r) {
    ll mid = (l + r) >> 1;
    if (cheak(mid)) {
        l = mid; // 最后满足条件位置
    } else {
        r = mid - 1
    }
}
std::cout << l << std::endl;

浮点二分

while(r-l>1e-5) //需要一个精度保证
	{
		double mid = (l+r)/2;
		if(check(mid)) l=mid; //或r=mid;
		else r=mid; //或l=mid;
	}

二分答案题

可凑成的最大花束数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值