Description
给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数。
Input
第1行一个正整数n。
第2行n个正整数用空格隔开。
Output
一行一个正整数表示那个众数。
Sample Input
5 3 2 3 1 3
Sample Output
3
Hint
100%的数据,n<=500000,数列中每个数<=maxlongint。
zju2132 The Most Frequent Number
注意:这道题的内存限制只有1M,随便设一个数组都会超内存的~然而起初我竟然用了map数组。。。Too young too simple.
百度了一下,有一个神奇的算法,要求输出的那个数是出现超过一半的~~那么,纪录它出现的次数即可,不是它,次数减1,是它次数加1,如果次数小于零了,说明它的次数没有超过一半,就换数,继续纪录。
AC-code:
#include<cstdio>
int main()
{
int k,ans,n,a;
scanf("%d",&n);
while(n--)
{
scanf("%d",&a);
if(a==ans)
k++;
else
k--;
if(k<0)
{
k=1;
ans=a;
}
}
printf("%d\n",ans);
return 0;
}