日新计划Leetcode之 169. 多数元素

86 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

一、题目描述:

169. 多数元素 - 力扣(LeetCode)

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

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

示例 1:

输入:[3,2,3]
输出:3

示例 2:

输入:[2,2,1,1,1,2,2]
输出:2

进阶:

尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

二、思路分析:

摩尔投票法基于这样一个事实,当一个数的重复次数超过数组长度的一半,每次将两个不相同的数删除,最终剩下的就是要找的数。
思路:

  1. count = 1; num = nums[0]; 表示从此时开始计算投票。
  2. 遍历数组,如果接下来出现的数字与num相同,count加1。如果不同,count减1。
  3. 如果count == 0,表示之前出现的所有数字中num都是可以凑成不同的数对,一起抵消。大于1/2 n的数还会在后面出现。(如果count<0,也是可以凑成不同的数对)

三、AC 代码:

class Solution(object):
    def majorityElement(self,nums):
        tmp = nums[0]
        count = 1
        for i in range(1, len(nums)):
            if count<=0:
                tmp = nums[i]
                count = 1
                continue
            if nums[i]==tmp:
                count = count + 1
            else:
                count = count - 1
        return tmp

总结

高赞评论说的很清楚
res为军队编号,先选择第一个数字观察
count为当前军队剩余兵力

遇到敌人则消灭敌人并且我方兵力-1
遇到自己人则我方兵力+1

如果我方兵力为0时遇到敌军则修改军队编号为敌军的编号
最后活下来的那个队伍就是多数

范文参考

多数元素(快速选择和投票法通俗理解) - 多数元素 - 力扣(LeetCode)

【画图分析】169 题 多数元素 - 多数元素 - 力扣(LeetCode)