02二分
二分
问题
适用于一个序列,有一个check函数,能够使得序列左边都返回false,右边都返回true,然后我们找的就是这个分界点的时候
基本思想
两种情况
一种是求 左半段最后一个元素,也就是说求上界,比如求 小于等于 x 的最后一个元素
这时候 mid = l + r + 1 >> 1;
bool check(int mid , int x){ return q[mid] <= x; } if(check(mid,x)) l = mid; else r = mid - 1;
另一种情况是求 右半段的第一个元素,也就是求下界,比如求 大于等于 x 的第一个元素
这时候 mid = l + r + 1 >> 1;
bool check(int mid , int x){ return q[mid] >= x; } if(check(mid,x)) r = mid; else l = mid + 1;
模板
给定一个序列 q , 求大于等于 x 的第一个值 右半段的第一个
bool check(int mid , int x){ return q[mid] >= x; } int l = 0, r = n - 1, mid; while (l < r) { mid = l + r >> 1; if (check(mid, x)) r = mid; else l = mid + 1; } if(q[l] == x) ...
给定一个序列 q , 求小于等于 x 的最后一个值 左半段的最后一个
bool check(int mid , int x){ return q[mid] <= x; } int l = 0, r = n - 1, mid; while (l < r) { mid = l + r + 1 >> 1; if (check(mid, x)) l = mid; else r = mid - 1; } if(q[l] == x) ...
----------------------------------------------------------------------------------------------------------
本文作者:咿呀咿呀悠
本文链接:https://www.cnblogs.com/da-zhi/p/17019626.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步