多数投票算法

多数投票算法是一种用O(1)的空间复杂度,来求出数组中众数的算法:

其实这个算法十分好理解,最直观的说,我们要再数组中找到大于n/k的数,首先我们要明白一件事,举个例子,k=2,这时候,整个数组中比n/2还要多的数只有可能是一个,而k=3时,数组中比n/3还要多的数最多也只能有两个,同理可得,当为k的时候,数组中出现这种元素的个数最多只有可能有k-1个。

所以,到这里,我们可以设k-1个候选人,一个不同元素,每一个候选人都有一个自己的票数统计,如果下一个元素投票是跟某一个候选人相同,当前候选人的票数加一,如果都不相同,先判断候选人的票数有没有被清空,如果被清空,则更换候选人,票数置一,当然,如果候选人都为空,也只能更换一个候选人,一个人投票不可能当多个候选人,如果当前元素投票是与所有候选人无关,而且所有候选人都有票数,那就把当前投票抛弃,将所有候选人的票数减一。

遍历一遍数组过后,我们得到了最后的候选人名单,然而,是不是这些候选人都是呢?当然不确定,此时我们还要把他们的票数全部置零,然后再重新遍历一遍数组,重新真正的统计他们的票数,最后,如果有达到要求的,就压入数组。

当然,免得大家说我空谈,我就先写一个k=3的解法来阐述我上面的流程:

vector<int> findthree(vector<int> &nums
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值