永发信息网

第二大的数问题

答案:2  悬赏:70  手机版
解决时间 2021-07-26 04:29
描述
给出N个整数,请求出小于M的第二大的数。
输入
题目包含多组输入,每组数据第一行包括两个整数N,M(0<=M<=N<=1000),N,M=0时结束。第二行包括N个整数xi(0<=xi<=100000)。
输出
输出N个数中小于M的第二大的数,如果不存在则输出-1。
样例输入
5 103100 101 102 103 1045 103100 101 101 103 1040 0
样例输出
101101要代码
最佳答案

如果要简单的话,将所有数字用快速排序排好,然后用二分法找到小于M的第二大的数即可。时间代价是nlog(n) + log(n)


如果要高效的算法,则可以考虑使用最大堆,最大堆的好处是无需将所有数都排序。思路如下:


1。将输入时大于M的数都过滤,只留下小于M的数。


2。在小于M的数里,用最大堆的方法求出第二大的值。


建堆的算法时间为O(n),取第二大值的时间代价为log(n),总代价为 O(n) + log(n).代码如下:


void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}


bool IsLeaf(int n,int pos)
{
return (pos >= n/2) && pos < n;
}
void SiftDown(int* a, int n, int pos)
{
while( ! IsLeaf(n,pos))
{
int leftChild = 2* pos + 1;
int rightChild = leftChild + 1;

int maxChild = leftChild;
if(rightChild < n && a[rightChild] > a[leftChild])
maxChild = rightChild;


if( a[pos] < a[maxChild] )
{
swap(a[pos], a[maxChild]);
}


pos = maxChild;
}
}


void BuildHeap(int *a, int n)
{
for(int i = n/2 -1; i >=0; i --) SiftDown(a,n,i);
}


int main()
{


int n,m,count = 0;
scanf("%d %d",&n, &m);
int* a = new int[n];
for(int i = 0; i < n; i++)
{
scanf("%d",&a[count]);
if(a[count] < m) count++;
}


if( count < 2) printf("-1");


BuildHeap(a,count); //建立最大值堆
swap(a[0],a[count - 1]); //移除最大值, 将数组最后一个元素放到最大值的位置
SiftDown(a, count - 1, 0); //重新设置最大值


printf("%d",a[0]); ///输出此刻最大值
return 0;
}

全部回答

能把样例给的详细点么?

我硬是没看懂你的样例

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
0 9 —1 0 赛季、火箭能否挺进季后赛?
QQ音速怎样用钱点亮?
高一函数体,高手来(180分)
G1鼠标脚贴问题
She is on a visit
我的妹妹要结婚了,第2天要怎样去接她哪?注
谁知道这个软件怎么把ASV2009给破解出来
我用的是宏基的笔记本,有谁可以告诉我,这个
大魔竞亚军Poker原名叫什么
想找首中文舞曲
山东专升本考试试题,2016年山东专升本考试真
谁邀我游戏人生啊!!!!
问河南兴业通信网络工程有限公司有没有在工商
谁可以告诉我些用“亿”和“万”做单位的数
我号82,2灵2敏金现在速度1000,我带啥宝宝好带
推荐资讯
电脑外观用不了是怎么回事?
怎样搭配冬天的衣服呢?
“烟笼寒水月笼沙”中“寒”怎么理解?
领养QQ宠物需要手机上的钱吗
丝路英雄的空间?
为什么海拔高的地方紫外线高?
什么是社会必要劳动时间.个别劳动时间呢.又影
寻仙里用炼妖壶原型侍宠可以炼神宠吗?
谁能给我介绍一下诺基亚5320的优点和所有功能
pvp显示勋章是否使用插件
夸妻子贤惠的诗句,赞美女人聪明,贤惠的古诗有
对生活失去热情的句子,生活就是享受生活所带
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?