题目
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
You may assume that the array is non-empty and the majority element always exist in the array.
Example 1:
Input: [3,2,3]
Output: 3
Example 2:
Input: [2,2,1,1,1,2,2]
Output: 2
总结:
思路一:使用hashmap记录个数
代码:
class Solution:
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dict = {}
for n in nums:
if n in dict:
dict[n] += 1
else:
dict[n] = 1
size = len(nums)
for n,f in dict.items():
if f > size / 2:
return n
时间复杂度为O(n),空间复杂度O(n)
思路二:使用分治算法,每次把数组拆成两部分,分别找到两部分的频率最高的数,再汇总拆分的两部分获得整体的频率最高的数。
代码:
class Solution:
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
def maxF(l, r):
if l == r:
return nums[l]
middle = (l + r) // 2
left_max = maxF(l, middle)
right_max = maxF(middle + 1, r)
if left_max == right_max:
return left_max
# 汇总拆分部分,计算频率
left_max_f = sum([1 for i in range(l, middle + 1) if nums[i] == left_max])
right_max_f = sum([1 for i in range(middle + 1, r + 1) if nums[i] == right_max])
if left_max_f > right_max_f:
return left_max
else:
return right_max
return maxF(0, len(nums) - 1)
时间复杂度:O(nlgn)
思路三:Boyer-Moore Voting Algorithm(摩尔投票算法),重复删除掉两个不同的数,最后剩下的相同的数就是所求。
可以用计数的方法代表删除,第一个数记1,后面碰到相同的数+1(等待删除),碰到不同的数-1(删除)
代码:
class Solution:
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
count = 0
for n in nums:
if count == 0:
major = n
count = 1
continue
if n == major:
count += 1
else:
count -= 1
return major