求主元素

来源:互联网 发布:知乎live可以回看吗 编辑:程序博客网 时间:2024/05/22 17:04
问题描述:有一个整数数列,数列中元素出现次数超过一半的元素定义为主元素,设计一分治算法,求出主元素。
输入:整数的个数n以及n个整数

输出:如果有主元素,输出主元素以及它们所在的位置;如果没有主元素,输出-1.

考研数据结构题:

#include <iostream>using namespace std;int searchMain(int A[],int n){int i;int c=A[0],count=1;for(i=1;i<n;i++){if(A[i]==c){count++;}else{if(count>0){count--;}else{c=A[i];count=1;}}}if(count>0){for(i=count=0;i<n;i++){if(A[i]==c){count++;}}}if(count>n/2){return c;}else{return -1;}}#define LEN(arr) sizeof(arr)/sizeof(arr[0])int main(int argc,char* argv[]){int count;    cin>>count;  while (count--) {  int n;cin>>n;//int a[]={0,5,5,7,5,5,3,6,5,3,3,3,3,3,3,3,3,3,3,8};int *a=new int[n];//输入动态数组for(int i=0;i<n;i++){cin>>a[i];}int c=searchMain(a,n);printf("%d\n",c);}return 0;}
#include <iostream>using namespace std;int searchMain(int A[],int n){int i;int c=A[0],count=1;for(i=1;i<n;i++){if(A[i]==c){count++;}else{if(count>0){count--;}else{c=A[i];count=1;}}}if(count>0){for(i=count=0;i<n;i++){if(A[i]==c){count++;}}}if(count>n/2){return c;}else{return -1;}}//计数排序int Major(int A[],int n){int i,*p,max;p=(int*)malloc(sizeof(int)*n);for(i=0;i<n;i++){p[i]=0;}max=0;for(i=0;i<n;i++){p[A[i]]++;if(p[A[i]]>p[max]){max=A[i];}}if(p[max]>n/2){return max;}else{return -1;}}#define LEN(arr) sizeof(arr)/sizeof(arr[0])int main(int argc,char* argv[]){int count;    cin>>count;  while (count--) {  int n;cin>>n;//int a[]={0,5,5,7,5,5,3,6,5,3,3,3,3,3,3,3,3,3,3,8};int *a=new int[n];//输入动态数组for(int i=0;i<n;i++){cin>>a[i];}int c=Major(a,n);printf("%d\n",c);}return 0;}



0 0
原创粉丝点击