- 题目描述
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
- 示例
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
- 解决思路一
既然是假定了一定存在众数,那么我们可以对数组进行排序,排序之后不论是按升序还是降序,众数一定会出现在数组中间的位置。
- 代码一
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort()
length = len(nums)
if length == 0:
return None
elif length == 1:
return nums[0]
else:
index = length/2
result = nums[index]
return result
- 解决思路二
非常厉害的摩尔投票法
算法的核心思想是同加,异减。对任意指定的暂定众数,遍历数组中的数字,与该数相同的话,计数值+1,否则计数值-1。如果在某个位置时计数值为0,则表示从数组开始到该位置没有众数。那么就从下一个数字重新开始遍历,以下一个数字作为暂定众数。
- 代码二
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#暂定众数为数组的第一个元素
crowd = nums[0]
#计数值为1
count = 1
#从数组的第二个元素开始遍历
for i in range(1,len(nums)):
if nums[i] == crowd:
count += 1
else:
count -= 1
#如果在某个位置计数值为0 ,就从下一个元素开始重新开始求众数
if count == 0:
crowd = nums[i+1]
return crowd