原题地址。
题目描述
解题思路
方法一: 排序
先排序,再返回最中间那个元素即可。因为题目中说有一个数字超过数组长度的一半,所以不论是从前往后看,还是从后往前看,中点的位置一定是目标数字。
该方法的复杂度如下:
-
时间复杂度:O(NlogN)。python中的sorted排序,用的Timsort算法。
-
空间复杂度:O(1)。
源代码
class Solution:
def majorityElement(self, nums: List[int]) -> int:
nums = sorted(nums)
return nums[len(nums)//2]
运行结果
方法二:哈希表
利用哈希表,统计每个元素出现的次数,返回次数最多的元素即可。
也可用python中collections中的Counter统计。
该方法的复杂度如下:
-
时间复杂度:O(N)。
-
空间复杂度:O(N)。
源代码
class Solution:
def majorityElement(self, nums: List[int]) -> int:
hashmap = {}
for num in nums:
if num in hashmap:
hashmap[num] += 1
else:
hashmap[num] = 1
return max(hashmap, key=hashmap.get)
运行结果
方法三:摩尔投票法
学习大佬的解法。
源代码
class Solution:
def majorityElement(self, nums: List[int]) -> int:
vote = x = 0
for num in nums:
if vote == 0:
x = num
if x == num:
vote += 1
else:
vote -= 1
return x
根据题目解析精简一下:
class Solution:
def majorityElement(self, nums: List[int]) -> int:
votes = 0
for num in nums:
if votes == 0: x = num
votes += 1 if num == x else -1
return x