摩尔投票

先给出做法

m,cnt = 0,0
    for n in a:
        if cnt == 0:
            m = n
            cnt = 1
        elif n == m:
            cnt += 1
        else:
            cnt -= 1
    return m

讲一下正确性

我们将上述看成配对操作,对于cnt==0的这个if和n==m的这个if,我们认为是新创建了一个对,目前这个对只有第一分量,即当前的m;对于最后一个else,我们认为是用当前的n去与当前的m配对(即填充第二分量),那么最终遍历完之后就会得到一些二元组,这些二元组的第一第二分量都不相等

如果最后的\(m\)不是主元素(假设存在主元素),那么这个\(m\)会单独成对,原数组的主元素一定是会与其他元素配对的,但是主元素的个数已经超过一半了,不可能满足与其他元素配对,所以最后的\(m\)一定是主元素

posted @ 2024-04-28 19:33  最爱丁珰  阅读(3)  评论(0编辑  收藏  举报