思路:
首先把主元 确定为A[0],并计数cnt=1。之后从下标为1开始遍历数组,
1.如果A[i] == A[0],cnt++
2.如果不等,则如果cnt>0,cnt–,如果cnt<0,主元设定为A[i],cnt=1。
遍历结束后,再遍历一遍,确定主元的出现的次数,大于n/2,返回主元,否则返回-1
代码如下:
#include <iostream>
using namespace std;
int Majority(int* A, int n)
{
int majority = A[0];
int cnt = 1;
for(int i = 1 ; i < n ; i++){
if(A[i] == majority){
cnt++;
}else{
if(cnt > 0){
cnt--;
}else{
majority = A[i];
cnt = 1;
}
}
}
cnt = 0;
for(int i = 0 ; i < n ; i++){
if(A[i] == majority){
cnt++;
}
}
if(cnt <= n/2){
majority = -1;
}
return majority;
}
void Print(int* A,int n)
{
for(int i = 0 ; i < n ; i++){
cout<<A[i]<<" ";
}
}
int main()
{
int A[8] = {0,5,5,3,5,7,5,5};
int B[8] = {0,5,5,3,5,1,5,7};
int majority = Majority(A,8);
cout<<"数组A为:"<<endl;
Print(A,8);
if(majority == -1){
cout<<"数组A没有主元"<<endl;
}else{
cout<<"数组A主元为:"<<majority<<endl;
}
cout<<"数组B为:"<<endl;
Print(B,8);
majority = Majority(B,8);
if(majority == -1){
cout<<"数组B没有主元"<<endl;
}else{
cout<<"数组B主元为:"<<majority<<endl;
}
return 0;
}
截图为: