一、题目
二、解题
1.题目
这是一个解决“寻找中位数”问题的代码。给定一个长度为 N(N为奇数)的数组,代码会输出这个数组的中位数。
代码思路:首先使用计数排序对数组进行预处理(记录每个数出现的次数),然后从小到大枚举每一个数,找到第一个出现次数与中位数相加不小于总数一半的数,最后判断该数的出现次数是否恰好等于中位数。如果是,则输出该数,否则输出-1。
2.代码
dev c++ 5.11
#include<iostream>
#include<cstring>
using namespace std;
int valcount[1010];
int main(){
int n;
cin>>n;
int val;
memset(valcount,0,sizeof(valcount));
for(int i=0;i<n;i++){
cin>>val;
valcount[val]++;
}
int ans,mid=(n+1)/2,count=0,left;
for(int i=0;i<=1010;i++){
if(count+valcount[i]>=mid){
left=count;
count=0;
ans=i;
}else{
count+=valcount[i];
}
}
if(left==count){
cout<<ans<<endl;
}else{
cout<<-1<<endl;
}
return 0;
}
3.提交结果
总结
-
代码详细思路。
找到给定数字序列中的中位数,如果没有中位数则输出 -1。下面是代码的详细思路: -
首先,从标准输入获得数字序列的长度 n,然后在读取一个整数作为输入值 val。
-
声明一个大小为 1010 的数组 valcount, 数组用处是统计每个数字出现的次数。
-
遍历长度为 n 的数字序列,并将数字出现的次数累加到 valcount 数组中。
-
如果数字序列的长度为奇数,则中位数为第 (n+1)/2 个数字。如果数字序列的长度为偶数,则中位数为第 n/2 个数字和第 n/2+1 个数字的平均值。
-
遍历从 0 到 1010 的数字,逐一查找累加数字出现次数,直到 count+valcount[i]>=mid。在这一点上,计算中位数应该在值 i 中。数字 i 是中位数的候选值。
-
如果在遍历数组时存在两个相邻的数字之间没有数字,使 count < mid < count + valcount [i +1]。那么最后再检查这个区间之前的数字。这个区间内的数字不能是中位数。只有当遍历完所有的数字,左右两边的数字数量相同时,中位数候选值才是中位数,输出中位数的值。如果左右两边的数字数量不同,所以没有中位数,输出 -1。