Description
给出一个
n(n≤5×105)
个数的数列,其中某个数出现了至少
⌊n/2⌋+1
,也就是超过一半。求这个数。
内存限制1MB。
Solution
很妙的解法…当然不是我想出来的。
看代码即可。
Code
//mode
#include <cstdio>
int main()
{
int n; scanf("%d",&n);
int ans=0,cnt=0;
for(int i=1;i<=n;i++)
{
int x; scanf("%d",&x);
if(x==ans) cnt++;
else if(--cnt<0) ans=x,cnt=1;
}
printf("%d",ans);
}
每有一个与当前 ans 不同的数,就消掉一个 ans 。但因为出现超过一半的数无论如何也不可能被消掉,而且这样的数唯一,正确性就很显然啦。