数据结构【数组、摩尔投票法】| leetcode 169. 多数元素(简单)

代码链接:https://leetcode.cn/problems/majority-element/solution/lai-zi-bei-da-suan-fa-ke-de-leetcodeti-j-e42a/

图片讲解:https://leetcode.cn/problems/majority-element/solution/tu-jie-mo-er-tou-piao-fa-python-go-by-jalan/

视频链接:https://leetcode.cn/problems/majority-element/solution/javashi-pin-jiang-jie-xi-lie-majority-element-by-s/

“同归于尽消杀法” :也称Boyer-Moore 投票算法(摩尔投票法)。

由于多数超过50%, 比如100个数,那么多数至少51个,剩下少数是49个。

  • 第一个到来的士兵,直接插上自己阵营的旗帜占领这块高地,此时领主 winner 就是这个阵营的人,现存兵力 count = 1。
  • 如果新来的士兵和前一个士兵是同一阵营,则集合起来占领高地,领主不变,winner 依然是当前这个士兵所属阵营,现存兵力 count++;
  • 如果新来到的士兵不是同一阵营,则前方阵营派一个士兵和它同归于尽。 此时前方阵营兵力count --。(即使双方都死光,这块高地的旗帜 winner 依然不变,因为已经没有活着的士兵可以去换上自己的新旗帜)
  • 当下一个士兵到来,发现前方阵营已经没有兵力,新士兵就成了领主,winner 变成这个士兵所属阵营的旗帜,现存兵力 count ++。
  • 就这样各路军阀一直以这种以一敌一同归于尽的方式厮杀下去,直到少数阵营都死光,那么最后剩下的几个必然属于多数阵营,winner 就是多数阵营。(多数阵营 51个,少数阵营只有49个,死剩下的2个就是多数阵营的人)

参考链接:https://leetcode.cn/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        counter = 1
        winner = nums[0]
        for i in range(1, len(nums)):
            if nums[i] == winner:
                counter += 1            # 重新赋值后的winner的counter在这里+1
            else:
                counter -= 1
                if counter == 0:
                    winner = nums[i+1]  # 这里将winner重新赋值
        return winner

另一种写法:

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        counter = 0
        winner = 0 # None
        for num in nums:
            if counter == 0:
                winner = num
                counter = 1
            elif num == winner:
                counter += 1
            else:
                counter -= 1
        return winner
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值