查找主元素
一、问题:查找主元素
二、思路
找输入数组中出现次数最多的元素的次数是否>n/2+1。为加快效率,事先给数组从小到大或从大到小排序,借用如下代码中的g用以和a[i]比较,用num计数。
三、代码及解析
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int main()
{
int n,a[100000],d,j,i,g;
while(scanf("%d",&n)!=EOF)
{int flag=0,num=0;//注意其赋初值是在while里面。
if(n==1) printf("-1\n");//特殊情况单独讨论;
else {
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);//c++中的sort用以排序,默认为按数值从小到大排序。
g=a[0];//用g与数组元素进行比较。
for(i=1;i<n;i++)
{
if(a[i]==g){
num++;
if(num+1>n/2){
printf("%d\n",g);
flag=1;
break;//当主元素出现次数达到n/2+1时结束循环,提高效率。
}
}
else {
g=a[i];//当次数小于n/2+1时,g要重新赋值为a[i]。
num=0;//注意num也要重新计数;
}
}
}
if(flag==0) printf("-1\n");//flag为标识符用以判断是否存在主元素。
}
return 0;}