二分求操作后的最大最小中位数

这类题是让你求对序列进行一系列操作之后的最小/最大中位数

1|0求最小中位数

二分最小中位数,显然二分要符合 mid 越大越对,边界才能向下收缩。

对于这个条件,我们选择计算 小于等于 当前 mid 的数才是对的,因为这样显然 mid 越大 cnt 越大,而符合这个条件,我们就不断收缩上界,直到达到第一个 cnt(n+1)2 的值为止,第一个大于等于就是等于,也就是 cnt=n+12,正好就是要的中位数。

auto check = [&](const int mid) { //小于等于当前mid的数 cnt >= (n + 1) / 2 //进行一系列操作,统计操作后小于等于当前mid的个数 for(auto& ai : a) {cnt += ai <= mid;} return cnt >= (n + 1) / 2; }; int lo{}, hi{(int)1E9}; while (lo <= hi) { int mid{(int)(lo + hi >> 1)}; check(mid) ? hi = mid - 1 : lo = mid + 1; }

2|0求最大中位数

那么就是要符合 mid 越小越对,边界才能向上收缩。

对于这个条件,我们选择计算 大于等于 当前 mid 的数才是对的,因为这样显然 mid 越小 cnt 越小,而符合这个条件,我们就不断收缩下界,直到达到第一个 cnt(n+1)2 的值为止,第一个大于等于就是等于,也就是 cnt=n+12,正好就是要的中位数。

auto check = [&](const int mid) { //大于等于当前mid的数 cnt >= (n + 1) / 2 //进行一系列操作,统计操作后小于等于当前mid的个数 for(auto& ai : a) {cnt += ai <= mid;} return cnt >= (n + 1) / 2; }; int lo{}, hi{(int)1E9}; while (lo <= hi) { int mid{(int)(lo + hi >> 1)}; check(mid) ? hi = mid - 1 : lo = mid + 1; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/18487334.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示