关于用摩尔投票法求解LeetCode 169题-多数元素的理解

这道题有很多种解法,如统计每个数出现的次数,或者排序等,都是比较容易想到的,官方的题解也有提到,这里就不赘述了。

题解链接

力扣

但是摩尔投票法,我是怎么也想不通,看了官方的题解,也搜了网上帖子的说法,都一知半解的。说是互相消耗,到最后胜出的就是最多的,听起来好像理解了,但是实际看代码,还是不理解。


为什么最后一个count = 0后的第一个元素,一定是众数?
首先我们得明白count = 0的意义,然后再来理解最后一个count = 0的意义。
count = 0,说明前面的正反双方都消耗完了,大家又重新开始了。那重新开始拿到的第一个数,怎么保证一定是众数呢?特别难理解是吧?关键就在于它是最后一个count = 0 !!!
这里我们用反证的思想,如果这个数不是众数,那后面的众数肯定会把这个数消耗掉,count还是会变回0,那这个count就不是最后一个0了。要记住最终的count一定是大于0的。
你可能还要问,为什么这个数一定会被消耗掉?这个数就是最后一个元素不就好了吗?或者最后几个数都是这个数,count也能大于0。
这听起来挺有道理的……但是我转念一想,这是不可能的!!!最后的count = 0后的那段数字,一定是众数多于非众数的。这个也可以反证,如果最后一段的众数少于非众数,说明前面的数据中,众数一定多于非众数,这就导致count != 0。
所以最后一段的众数一定多于非众数,而最后一个count = 0后的第一个元素,一定是众数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值