思路:摩根投票法
- 多支军队在打仗(或者联想投票也行),每轮出一个人(遍历
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 0cur_candidate, num_candidates = nums[0], 0for person in nums:# 如果是同一方if person == cur_candidate:num_candidates += 1else:# 不是同一方就 -1num_candidates -= 1# 如果减到0了就换边if num_candidates == 0:cur_candidate = person# 此时的候选人数量也要 + 1num_candidates += 1return cur_candidate
另外也有分治的办法,但是速度太慢了,所以我就没有写
