方法一:时间复杂度高O(n^2)
#include<bits/stdc++.h>
using namespace std;
int a[5]={2,5,6,8,9};
int b[5]={1,2,5,2,2};
int n=sizeof(a)/sizeof(a[0]);
int major(int a[],int n){
int k=0; //用于记录出现次数
//设a[i]为当前主元素
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i]==a[j]) k++;
}
if(k>n/2) return a[i];
k=0; //注意换主元素时要重置k
}
return n-1;
}
int main(){
//cout<<n<<" ";
int t=major(b,n);
cout<<t<<endl;
return 0;
}
方法2:摩尔投票法。
时间复杂度O(n),空间复杂度O(1)
思路:一次遍历找到候选元素,一次遍历验证元素是否为主元素。
步骤一:找候选元素:
设候选元素c为数组第一个元素。count初始化为1(第一个元素已被考虑);
从数组第二个元素开始遍历,相同则count++;不同则:count>0时count--,直到count=0时,更新候选元素,并设count为1。
步骤二:验证候选元素:
重新遍历候选元素出现次数,大于n/2次则为主元素
#include<bits/stdc++.h>
using namespace std;
int b[5]={1,2,5,2,2};
int n=sizeof(b)/sizeof(b[0]);
int major(int a[],int n){
int c=a[0],count=1;
for(int i=1;i<n;i++){
if(c==a[i]) count++;
else{
if(count>0) count--;
else {
c=a[i];
count=1;
}
}
}
count=0;
for(int i=0;i<n;i++){
if(a[i]==c) count++;
}
if(count>n/2) return c;
else return -1;
}
int main(){
cout<<n<<" ";
int result=major(b,n);
cout<<result<<endl;
return 0;}