题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 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: 摩尔投票法
- 确定数组首元素为需要投票的元素, 从index=1开始遍历数组
- 如果遍历到的元素与投票元素相同, 则count+1, 如果不同 count-2
- 如果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