题目描述:
给你一个数组,输出里面出现超过1/2的元素。保证有且只有一个解。
输入描述:
第一行是一个整数n(n <=1e7),表示测试数据的个数 ,之后每一行都是一个整数。
输出描述:
输出出现超过1/2的那个数字。
输入样例:
5
1
1
1
2
3
输出样例:
1
核心思想:
因为出现最多的元素超过了1/2,所以任意两个不同的元素可以互相抵消,这样最后剩下的元素就是答案。时间复杂度降到了 O(n)。
不要使用 cin,测试数据很大,可以用快读优化。
代码如下:
#include<stdio.h>
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
int main()
{
int n,x,t,cnt=0;
n=read();
for(int i=n;cnt<i;i--)
{
t=read();
if(cnt)
{
if(x!=t)
cnt--;
else
cnt++;
}
else
{
x=t;
cnt++;
}
}
printf("%d\n",x);
return 0;
}