描述
输入
第一行:n(0 < n < 1000000)
第二行:n个数x1、x2...xn,0 <= xi <= 1000000000
输出
如果数组中存在主元素,输出主元素;否则输出-1
样例输入
样例输出
提示
设A是含有n个元素的数组,如果元素x在A中出现的次数大于n/2,则称x是A的主元素。现在请你在一个数组中找到主元素。
第二行:n个数x1、x2...xn,0 <= xi <= 1000000000
3 1 2 2
2
使用O(n)的算法
很容易知道
如果无序,不能比较大小的算法,具体思想就是“在一个集合中,删除两个不同的数,则集合的主元素保持不变。”根据这个原理,可以很快求出主元素。只有最后剩下的元素才可能是主元素。
代码如下
#include<iostream>
#include<stdio.h>
using namespace std;
int n,times,main_elem,x;
int a[1000050];
int main()
{
scanf("%d", &n);
for (int i=0; i<n; i++)
{
scanf("%d", &x);
a[i]=x;
}
times=0;
for (int i=0; i<n; i++)
{
if (times==0)
{
main_elem=a[i];
times++;
}else
{
if (main_elem==a[i]) times++;
else times--;
}
}
times=0;
for (int i=0; i<n; i++)
{
if (main_elem==a[i]) times++;
}
if (times>(n/2)) printf("%d", main_elem);
else printf("%d", -1);
return 0;
}