1 /*主元素问题:数组中是否存在一个元素重复大于n/2次 2 思路: 3 1,推排序,快排,归并排序后,取a[n/2]再遍历一次验证 o(nlogn) 4 5 2, 计数排序, o(n),要求数据分布较均匀,且是整数 6 7 3,删除两个不一样的元素,数组的主元素保持不变. 8 超过一半的这个主元素比其它元素都多,设seed=主元素, 9 遇到不一样的减一,一样的加一,最后seed至少为1。 o(n) 10 */ 11 #include<iostream> 12 13 using namespace std; 14 15 typedef int T; 16 17 int findMajor(T *a, int n) 18 { 19 int count=0,i; 20 T seed; 21 for(i=0;i<n;i++) 22 { 23 if(0==count) 24 { 25 seed=a[i]; 26 count++; 27 } 28 else if(seed==a[i]) 29 count++; 30 else if(seed!=a[i]) 31 count--; 32 } 33 count=0; 34 for(i=0;i<n;i++)//最后要验证 35 { 36 if(seed==a[i]) 37 count++; 38 } 39 if(count>n/2) 40 return seed; 41 else 42 return -1; 43 } 44 45 int main() 46 { 47 T a[]={2,3,1,2,2,2,5,4,2,2}; 48 int size=10; 49 int major=findMajor(a,size); 50 if(major==-1) 51 cout<<"no"; 52 else 53 cout<<major; 54 cout<<endl; 55 return 0; 56 }