图片讲解:https://leetcode.cn/problems/majority-element/solution/tu-jie-mo-er-tou-piao-fa-python-go-by-jalan/
“同归于尽消杀法” :也称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