寻找发帖“水王”

发帖水王发帖数目超过帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在里面,要求快速找出这个传说中的水王。

方法一:最直接的方法,对所有ID进行排序,然后再扫描一遍排好的序的ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过总数的一半,则输出这个ID。这个算法的时间复杂度为O(N*logN+N)。

方法二:如果ID列表已经是有序的,那么ID列表的第N/2项(从0开始编号)一定是这个ID。显然,水王ID出现超过N/2,所以N/2这个下标ID一定在水王ID数组区间中。如果不是超过,而是大于等于还是有问题,如4个,水王占两个,如果前两个是水王ID,则4/2=2不是水王ID。

方法三(写的算法很精辟):每次删除两个不同的ID,那么在剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。通过不断反复这个过程,把ID列表中的ID总数降低,从而得到问题答案。总时间复杂度为O(N)。

//很好的想法,i一直在增加,nTimes用来记录前面元素的火拼数目,如果nTimes变成0了,则候选元素就替换成ID[i]了。只有水王才能将nTimes一直维持,直到最后。

Type Find(Type* ID,int N){

    Typecandidate;

    intnTimes,i;

    for(inti = nTimes=0;i<N;i++){

        if(nTime==0){

            candidate=ID[i],nTime=1;

         }else{

            if(candidate==ID[i])

                 nTimes++;

            else

                 nTimes--;

         }

     }

     return candidate;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值