题目描述: 当数组中每个元素出现的次数大于len/2时,该数组的主元素就是就是该元素。
算法的设计思想:算法的策略是从前往后扫描数组元素,标记出一个可能成为主元素的元素num。然后重新计数,确认num是否是主元素。
算法可分为两步:
(1)选取候选的主元素:依次扫描所给数组中的每个整数,将第一个遇到的整数num保存到c中,记录num出现的次数为1;若遇到
下一个整数仍等于num,则计数加1,否则计数减1;当计数减到0时,将遇到的下一个整数保存到c中,计数重新记为1,
开始新一轮的计数,即从当前位置开始重复上述过程,知道扫描完全部的数组元素。
(2)判断c中元素是否是真正的主元素:再次扫描该数组,统计c中元素出现的次数,若大于len/2,则为主元素;否则,序列中不存在主元素。
代码:
#include<cstdlib>
#include<string>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<ctime>
#include<stack>
#include<map>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
int fun(int* a,int len)
{
int c=a[0],count=1;
for(int i=1;i<len;i++)
{
if(a[i]==c)
{
count++;
}
else
{
if(count>0)
{
count--;
}
else
{
c=a[i];
count=1;
}
}
}
count=0;
for(int i=0;i<len;i++)
{
if(a[i]==c)
{
count++;
}
}
if(count>len/2)
{
return c;
}
return -1;
}
int main()
{
int a[15]={1,3,3,33,33,3,3,3,3,4,5,3};
int len=12;
cout<<fun(a,len)<<endl;
return 0;
}