二分法中mid的处理以及STL二分函数
2023-12-14 03:55:52
若我们需要在单调递增序列中找 x 或 x 的后继 的 mid 计算方法:
? ? ? ? ?实现 | ? 使用场合 | 可能出现的问题???????? |
mid = (left + right) / 2 | left >= 0, right >= 0, left + right无溢出 | left + right可能溢出 负数情况下有向0取整问题 |
mid = left + (right-left)/2 | right - left 无溢出? ? ? | 若right 和left都是大数且一正一负,right - left可能溢出 |
mid = (left + right) >> 1 | left + right无溢出 | 若left和right都为大数,left + right可能溢出 |
三种方法各有优缺点,综合起来,mid = (left + right) >> 1 更好一些
若需要找 x 或 x 的前驱,则用 mid = (left + right + 1) >> 1 即可
关于对应的STL函数:
(1)upper_bound() : 查找第一个大于 x 的元素的位置,pos = upper_bound(a, a + n, x) - a;
(2)lower_bound() : 查找第一个等于或大于 x 的元素;
(3)upper_bound() - lower_bound() : 计算单调序列中 x 的个数。
文章来源:https://blog.csdn.net/m0_60936523/article/details/134839518
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!