牛客题解 | 中位数

题目

题目链接

题解:

考察点: 思维,数形结合

解法:

题目中要求的是让m成为新数列的中位数,则说明把新数列按照从小到大顺序排序后,m要正好处于[n12]的位置,于是采用数形结合的思想来解决此问题最为简单。首先统计原数组中小于m的元素个数Small,大于m的元素个数Big,等于m的元素个数equal。于是会出现有下图2种情况:

图片说明

如左边所示,若Big的元素个数多于Small,为了要使得m位于中间位置,应该使得Small+equal变得一样长,则增加的元素应该为Max(BigSmallequal,0)。如右图所示,若Small的元素多于Big,由于m的位置是取不超过n12的整数,于是Big+equal的长度至少要变得比Small大1,否则中位数位置一定位于Small半区,所以增加元素应该为Max(SmallBigequal+1,0)。最后,如果SmallBig一样长,那如果不存在equal则要增加1个元素,否则m自动位于中位数的位置上,复杂度O(n)

#include "bits/stdc++.h"
using namespace std;
const int maxn=1e5+100;
int n,m,a[maxn];
int main()
{
    scanf("%d%d",&n,&m);
    int small=0,big=0,equal=0;
    for(int i=0;i<n;i++){ scanf("%d",&a[i]); if(a[i]<m) small++; else if(a[i]>m) big++;
        else equal++;
    }
    if(small<big) printf("%d\n",max(big-small-equal,0)); else if(small>big) printf("%d\n",max(small-big-equal+1,0));
    else{
        if(equal==0) printf("1\n");
        else printf("0\n");
    }
    return 0;
}

</big)></n;i++){>

posted @   wangxiaoxiao  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示