首页 > 其他分享 >二分求操作后的最大最小中位数

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

时间:2024-10-20 15:11:17浏览次数:7  
标签:二分 cnt int lo mid 中位数 最小 等于

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

求最小中位数

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

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

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;
}

求最大中位数

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

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

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;
}

标签:二分,cnt,int,lo,mid,中位数,最小,等于
From: https://www.cnblogs.com/kdlyh/p/18487334

相关文章

  • Matlab使用LSTM或BiLSTM对一维信号(语音信号、心电信号等)进行二分类源程序。也可以改
     Matlab使用LSTM或BiLSTM对一维信号(语音信号、心电信号等)进行二分类源程序。也可以改成多分类。包含数据和代码,数据可以直接替换为自己的数据。如果用BiLSTM,程序中只需要把lstmlayer改为bilstmlayer即为BiLSTM网络,其他地方不需要任何改动。工作如下:1、加载数据集,一共为......
  • 茴香豆的茴有四种写法,那二分有几种写法?
    《编程珠玑》一书的作者JonBentley曾经说过:“90%的程序员无法正确实现二分查找算法...”,今天,本文将带领你会写二分。经典写法现在我们来求解这样一个通用的二分查找问题:有一个不下降序列$a$,我们要从其中所有找到大于等于$k$的数的最小的下标。boolcheck(intindex)......
  • 704.二分查找
    题目给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:输入:nums=[-1,0,3,......
  • 【数据结构与算法】之二分查找
    二分查找(BinarySearch)是一种在有序数组中查找特定元素的搜索算法。它通过比较数组中间元素与目标值来工作,从而将搜索范围缩小到一半,也称折半查找,是一种非常高效的工作于有序数组的查找算法。本文主要介绍二分查找及其几个变种,包括基础版、改变版、平衡版和Java版,以及Leftmost......
  • 【C++贪心】2086. 喂食仓鼠的最小食物桶数|1622
    本文涉及知识点C++贪心LeetCode2086.喂食仓鼠的最小食物桶数给你一个下标从0开始的字符串hamsters,其中hamsters[i]要么是:‘H’表示有一个仓鼠在下标i,或者’.’表示下标i是空的。你将要在空的位置上添加一定数量的食物桶来喂养仓鼠。如果仓鼠的左边或右边......
  • 111. 二叉树的最小深度
    思路递归时考虑几种情况:1.左右子树都为空,则最小深度=1(只有根节点)(也可理解为min(0,0)+1)2.左子树为空,右子树不空,则最小深度=右子树最小深度+13.左子树不为空,右子树为空,最小深度=左子树最小深度+14.左右子树不为空,最小深度=左右子树最小深度+1+1原因:递归的是左右子树,......
  • UOJ 80:二分图最大权匹配 ← KM算法
    【KM算法简介】Kuhn-Munkres算法,简称KM算法,是用于“二分图带权最大匹配问题”的经典算法。【题目来源】https://uoj.ac/problem/80【题目描述】从前一个和谐的班级,有nl个是男生,有nr个是女生。编号分别为1,……,nl和1,……,nr。有若干个这样的条件:第v个男生......
  • 代码随想录算法训练营day18 |530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数
    学习资料:https://programmercarl.com/0530.二叉搜索树的最小绝对差.html530.二叉搜索树的最小绝对差(双指针法,pre&cur,设置最小差值初始为无穷大,当差值<最小差值就更新最小差值)点击查看代码#Definitionforabinarytreenode.#classTreeNode(object):#def__init__(......
  • C. New Game (二分)
    时隔多年又做题了这不得来水一篇博客题意:给出n个数,取一段连续的数字,最大数和最小数的差不超过k,使得取的数最多。解:对于每一个数,找到第最后一个连续的且与其差值不大于k的数,数一数期间一共有几个,然后取最大值。实现上先处理出连续的段,对于每一个数,找到对应的段,二分找出差值不大于......
  • 111. 二叉树的最小深度【二叉树】
    文章目录111.二叉树的最小深度解题思路111.二叉树的最小深度111.二叉树的最小深度给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例1:输入:root=[3,9,20,null,null,15,7]......