剑指 Offer 39. 数组中出现次数超过一半的数字-Python题解

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

限制:

1 <= 数组长度 <= 50000

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        # 使用摩尔投票法解决该问题
        # 记录当前的被选择的票数,假设第一个数字为出现次数超过数组长度的一半的次数,且票数为1
        # 如果下一个数字跟当前数字一样,则票数加1,如果不一样,则票数减1,当前选择数字的票数等于0,则重新选择下一次的数字当成是数组众数超过一半的数字,同样的规则,最后留下来的数字就是目标数字
        votes = 0
        num = 0
        for i in nums:
            if votes == 0:
                # 当前元素当选新的数字
                num = i
                # 当前的票数等于1
                votes = 1
            else:
                # 如果该数字不等于我们选择的数字,则-1,否则+1
                if num != i:
                    votes -= 1
                else:
                    votes += 1
        # print(num)
        return  num

你可能感兴趣的:(算法,算法,leetcode,剑指Offer)