摩尔投票

先给出做法

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 @   最爱丁珰  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示