求解数组中的主元素
原题:《数据结构与算法分析C++描述(第三版)》练习2.26
问题描述:大小为N的数组的主元素是出现次数超过N/2的元素。找到给定数组的主元素,若没有,应指出。
完整代码:
1 #include<iostream> 2 #include<vector> 3 4 using namespace std; 5 6 void cand(vector<int> &v) 7 { 8 vector<int>::iterator itf = v.begin(); 9 vector<int>::iterator ite = v.begin(); 10 while(itf!=v.end()&&ite!=v.end()) 11 { 12 if(*itf==*ite) 13 { 14 itf=v.erase(ite); 15 ite=itf+1; 16 } 17 else 18 { 19 itf=v.erase(itf,ite); 20 ite=itf+1; 21 } 22 } 23 if(itf!=v.end()&&v.size()>1) v.erase(itf); 24 if(v.size()>2) cand(v); 25 } 26 int mainem(vector<int> v) 27 { 28 int len=v.size(); 29 vector<int> v1(v); 30 cand(v1); 31 int len1=v1.size(); 32 int count; 33 if(len1>0) 34 { 35 for(int i=0;i<len1;i++) 36 { 37 count=0; 38 for(int j=0;j<len;j++) 39 { 40 if(v[j]==v1[i]) count++; 41 } 42 if(count>len/2) return v1[i]; 43 } 44 } 45 if(len%2==1) 46 { 47 count=0; 48 for(int i=0;i<len;i++) 49 { 50 if(v[i]==v[len-1]) count++; 51 } 52 if(count>len/2) return v[len-1]; 53 } 54 return -1; 55 } 56 57 int main() 58 { 59 int x; 60 vector<int> v; 61 while(cin>>x) 62 v.push_back(x); 63 int result=mainem(v); 64 if(result>0) cout<<"main element:"<<result<<endl; 65 else cout<<"no main element"<<endl; 66 return 0; 67 }
注:为方便,将未找到主元素的返回值设为-1,所以测试使用正数数组。