摩爾投票

最爱丁珰發表於2024-04-28

先給出做法

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\)一定是主元素

相關文章