多数投票算法是一种用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