HDU-1029题解

题意很简单,给你一堆数字,让你找出这堆数字中相同次数大于 (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

所以次算法的正确性就是题目的前提:这个数出现的次数一定大于一半

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值