题意很简单,给你一堆数字,让你找出这堆数字中相同次数大于 (n+1)/2的
思路:
一开始想的是map,后来发现还有更省时间和空间的做法:
long long a;int b;
while (scanf("%d", &n) != EOF)
{
int num,count;
count=0;
for (int i = 0; i < n; i++)
{
scanf("%lld", &a);
if(count==0)
{
count++;
num=a;
}
else if(a==num)
{
count++;
}
else count--;
}
printf("%d\n",num);
}
/*
5
1 1 2 2 3
*/
num(目前出现最多次数的数) count(出现的次数)
思路
首先看到这个数字 (n+1)/2发现这个数字比n/2大,即这堆数字中,某个数出现的次数一定大于一半
上面的做法可以这样理解:
每个数出现一次,count就加一,count值最大的数就是所求数,
当数字a出现时,count++,此时将a赋值给num,
如果是数字b出现,则,count--(可以这样理解,这是一堆数字比谁最大,a先出现一个,则a比所有数字大1,b出现后,a与b的差距
就小1,所以count--,如果count减为0,那么下一个数字出现的时候,将这个数字赋值给num)
注意这个算法有漏洞 当count减为0时,下个数字出现num的值是一定会被刷新的,看一下例子:
6
1 1 2 2 3 1
5
1 1 2 2 3
输出3
所以次算法的正确性就是题目的前提:这个数出现的次数一定大于一半