数组中出现最多的元素-快读

博客围绕在数组中找出出现超过1/2的元素这一问题展开。给出题目描述、输入输出要求及样例,核心思想是利用元素抵消,将时间复杂度降至O(n),并建议用快读优化,避免使用cin处理大量测试数据。

题目描述:

给你一个数组,输出里面出现超过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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值