二分查找
可以使用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;
}
二分答案题