难点:二分的边界问题
确定一个区间,使得目标值一定在区间中。
找一个性质满足:(对于百分之95的二分拥有这个性质)
对于整数二分我们分为两类:
有的小伙伴就要问了:为什么是分成2类而不是1类3类呢?
答:我们来看这么一种情况
对于一组序列如下:要求找到值为5的第一个数和最后一个数,返回对应下标。
值 | 3 | 4 | 5 | 5 | 5 | 8 | 10 |
---|---|---|---|---|---|---|---|
数组下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
不难发现我们需要两个模板,使得一个板子二分结果为2,一个板子二分结果为4。
代码如下:
bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid; // check()判断mid是否满足性质else l = mid + 1;}return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{while (l < r){int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}return l;
}作者:yxc
链接:/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
789. 数的范围 - AcWing题库
下面是本节课总的题单,涉及前缀和等可以先不看跳过。
实数二分相对于整数比较简单,因为中点是基本可以取到的,没有整数一会加1,一会减去1这么绕。
加一减一无需考虑,可以说是非常简单了(滑稽,第一遍写还是WA了)。只需注意浮点数精度丢失问题,取误差在1e-8即可。
790. 数的三次方根 - AcWing题库
用的不多,这里简单提一下。
对于下图的函数,我们为了找值可以采取对斜率二分(求导即可)。或者,采取下图的三分法,当重复多次后,l与r无线逼近即可。
本文发布于:2024-01-28 10:03:03,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064073876635.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |