查找数组中的主元并输出
题目来源:
王道考研数据结构辅导书线性表顺序表示大题第12题(2013统考真题)
题目描述:
说明:
参考了王道课后题视频讲解的思路实现了代码,我采用的是容易想到的算法中的第一种(最优算法我想不到),感谢王道,这种思路做一道题类似的就都会做了,加油。
算法思路:
因为本题中说了数组中的元素大小都大于0且小于n,则暗示我们可以创建一个和数组A大小相同的辅助数组B,以空间换时间,这样可以保证时间复杂度更低。
代码实现:
#include<stdio.h>
#include <stdlib.h>
int GetMainElem(int A[],int n){
int *B = (int*)malloc(n*sizeof(int));//动态申请一个和A数组大小相同的B数组
int i,j,k,flag = 0;
for(k = 0;k < n;k++){//数组B初始化
B[k] = 0;
}
for(i = 0;i < n;i++){//数组B的下标就是数组A中元素的大小
B[A[i]] ++;//用数组B来统计数组A中各元素的出现次数
}
for(j = 0;j < n;j++){
if(B[j] > n/2){//若有主元则返回B数组下标,即所要求的A数组中元素的大小
flag = 1;
return j;
}
}
free(B);//注意,这个和 malloc()函数配套使用的free()函数
if(flag == 0){//数组A中没有主元
return -1;
}
}
int main(){
//测试
int A[8] = {0,5,5,3,5,7,5,5};
//int A[8] = {0,5,5,3,5,1,5,7};
int res = GetMainElem(A,8);
printf("%d",res);
}