题目
题目如上,需要认真读题,注意:题目要求输出的是中间数,不是我们熟知的中位数。中间数,简单来说就是:在已知的整数序列中,比它大的数的数量=比它小的数的数量。
样例
了解完题目之后,还需要注意下已给的样例,它们一般会提醒你有哪些不同情况。比如:
样例1:n为偶数时的特殊情况,顺序排列后,当中间两个数相等,中间数即为这个数。
样例2:n为偶数时的一般情况,如果数都不相等,则没有中间数,输出-1.
样例3:n为奇数时的特殊情况,顺序排列后,如果中间的数与前或后某数相等,则没有中间数,输出-1.
思路
思路一:
首先把给出的整数序列从小到大顺序排列
分为n为偶数和n为奇数两大类,再把其中没有中间数的特殊情况分类出来。
初步写出代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
for(int i=1;i<=n;i++){//为了后边的temp更方便表示,这里i要从1开始
cin>>a[i];
}
sort(a,a+n+1);//将整数序列从小到大顺序排列
if(n%2==1){
int temp=(n+1)/2;
if(a[temp]!=a[temp+1]&&a[temp]!=a[temp-1]){
cout<<a[temp];
}
else{
cout<<"-1";
}
}
if(n%2==0){
int temp=n/2;
if(a[temp]==a[temp+1]){
cout<<a[temp];
}
else{
cout<<"-1";
}
}
}
但是很遗憾(qi)只有80😭
猜测肯定是哪种情况没有考虑到,就多加了一种n为奇数时,中间三个数都相等时也有中间数的情况,反而变成了50分,心累。换方法!
思路二:
这是从别的博主那学来的方法。真的是学到了!!这个方法比我的更清晰有效,不需要分奇数偶数两类情况分析。
首先从小到大顺序排列
找到中间的数
从中间的数开始往左找有几个比它小的,往右找比它大的,分别记录数值
最后比较数值
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);//将整数序列从小到大顺序排列
int mid=n/2;
int leftnum=0,rightnum=0;
if(n==1){
cout<<a[0];
return 0;
}
for(int i=mid-1;i>=0;i--){
if(a[i]!=a[mid]) leftnum++;
}
for(int i=mid+1;i<n;i++){
if(a[i]!=a[mid]) rightnum++;
}
if(leftnum==rightnum){
cout<<a[mid];
}
else{
cout<<"-1";
}
}