这道题有很多种解法,如统计每个数出现的次数,或者排序等,都是比较容易想到的,官方的题解也有提到,这里就不赘述了。
题解链接
但是摩尔投票法,我是怎么也想不通,看了官方的题解,也搜了网上帖子的说法,都一知半解的。说是互相消耗,到最后胜出的就是最多的,听起来好像理解了,但是实际看代码,还是不理解。
为什么最后一个count = 0后的第一个元素,一定是众数?
首先我们得明白count = 0的意义,然后再来理解最后一个count = 0的意义。
count = 0,说明前面的正反双方都消耗完了,大家又重新开始了。那重新开始拿到的第一个数,怎么保证一定是众数呢?特别难理解是吧?关键就在于它是最后一个count = 0 !!!
这里我们用反证的思想,如果这个数不是众数,那后面的众数肯定会把这个数消耗掉,count还是会变回0,那这个count就不是最后一个0了。要记住最终的count一定是大于0的。
你可能还要问,为什么这个数一定会被消耗掉?这个数就是最后一个元素不就好了吗?或者最后几个数都是这个数,count也能大于0。
这听起来挺有道理的……但是我转念一想,这是不可能的!!!最后的count = 0后的那段数字,一定是众数多于非众数的。这个也可以反证,如果最后一段的众数少于非众数,说明前面的数据中,众数一定多于非众数,这就导致count != 0。
所以最后一段的众数一定多于非众数,而最后一个count = 0后的第一个元素,一定是众数。