思路:摩根投票法
- 多支军队在打仗(或者联想投票也行),每轮出一个人(遍历
nums
),第一个人默认是候选人 - 一轮出一个人,如果这个人和候选人是一方的(
nums[i] == cur_candidate
),那么计数器num_candidates += 1
- 如果这个人和候选人不一样,那么计数器减去1,需要注意的是,如果计数器变成0,需要执行两步操作:1.将候选人指定为新的人;2.原先数值为
0
的计数器增加1
为什么不会被后面出现的数字捡漏?因为计数器一直在统计数量,后面出现的数字再怎么搞也无法超过总数的一半,所以无法捡漏。
代码:
class Solution:
def majorityElement(self, nums: List[int]) -> int:
if not len(nums):
return 0
cur_candidate, num_candidates = nums[0], 0
for person in nums:
# 如果是同一方
if person == cur_candidate:
num_candidates += 1
else:
# 不是同一方就 -1
num_candidates -= 1
# 如果减到0了就换边
if num_candidates == 0:
cur_candidate = person
# 此时的候选人数量也要 + 1
num_candidates += 1
return cur_candidate
另外也有分治的办法,但是速度太慢了,所以我就没有写