题目来源:
王道考研数据结构辅导书线性表顺序表示大题第12题(2013统考真题)
题目描述:
说明:
参考了王道课后题视频讲解的思路实现了代码,我采用的是容易想到的算法中的第一种(最优算法我想不到),感谢王道,这种思路做一道题类似的就都会做了,加油。
算法思路:
因为本题中说了数组中的元素大小都大于0且小于n,则暗示我们可以创建一个和数组A大小相同的辅助数组B,以空间换时间,这样可以保证时间复杂度更低。
代码实现:
#include#include 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); }



