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

127 阅读1分钟

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。

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

解题思路1: map法

创建一个map, 对应value和value的个数, 然后遍历map找到多数元素

示例代码1: 略

解题思路2: 排序法

因为多数的元素超过了数组长度的一半, 所以在排序后, 数组中间的元素一定是该元素

示例代码2:

def majorityElement(self, nums: [int]) -> int:
    nums.sort()
    return nums[int(len(nums) / 2)]

解题思路3: 摩尔投票法

  1. 确定数组首元素为需要投票的元素, 从index=1开始遍历数组
  2. 如果遍历到的元素与投票元素相同, 则count+1, 如果不同 count-2
  3. 如果count=0, 就更换投票元素为当前遍历的元素, 并且重置count=1

因为多数元素的个数大于数组一半, 所以在投票过程中, 他的count会很大, 并且其他不同的元素不足以将他的count减到0

示例代码3:

def majorityElement(self, nums: [int]) -> int:
    moer = nums[0]
    count = 1
    for i in range(1, len(nums)):
        if nums[i] == moer:
            count += 1
        else:
            count -= 1
        if count == 0:
            count += 1
            moer = nums[i]
    return moer