问题
已知一个整数序列A={},其中(),若存在且m>n/2(),则称X为A的主元素。例如A={0,5,5,3,5,7,5,5},则5为主元素,又如A={0,5,5,3,5,1,5,7},则A中没有主元素。假设A中的n个元素保存在一个一维数组中,设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素,否则输出-1。
分析
数组A有n个整数,且数组中每个元素值都小于n,所以可以再申请一个长度为n的数组B,数组B中的值代表下标在数组A中出现的次数。
如 A 0 5 5 3 5 7 5 5
则 B 1 0 0 1 0 5 0 1
下标 0 1 2 3 4 5 6 7
边遍历边统计。
代码
int mainNum(int A[], int n) {
int max = -1, temp = -1;///初始值 最大值为-1,所在位置-1
int *B = (int *)malloc(sizeof(int) * n);
for(int i = 0; i < n; i++) {
*(B + i) = 0;
}///申请长度为n的B数组并赋初值0
for(int i = 0; i < n; i++) {///遍历数组
*(B + A[i]) = *(B + A[i]) + 1;///下标为B[A[i]]的值在原来的基础上加1
if(*(B + A[i]) > max){///如果B[A[i]]的值大于max,即最有可能是众数的,记录出现的次数和位置
max = *(B + A[i]);
temp = i;
}
}
if(*(B + A[temp]) > n / 2) {///出现次数最多的数出现次数大于n/2 是众数
return A[temp];
}else {///否则不是众数
return -1;
}
}
源代码
http://123.206.59.223:8080/code/code/5.rar