【题目描述】
【代码思路】这道题是对摩尔投票法的一个升级,摩尔投票法参考我的这篇文章求众数- 摩尔投票法 摩尔投票法本来是求一个数组中的大多数的一种方法,它的时间复杂度是线性的,空间复杂度是常数级的。而求一个数组中数量前两名的算法是一个升级,在一个循环中,用两个变量对数值进行保存。
m=cm=0
n=cn=0
复制代码
其中m,n是前两名的数值,cm和cn是一个计数器,m和n是不分第一还是第二的。
for num in nums:
if num == m:
cm += 1
elif num == n:
cn += 1
elif cm == 0:
m = num
cm = 1
elif cn == 0:
n = num
cn = 1
else:
cm -= 1
cn -= 1
复制代码
因为我们要求出现次数超过n/3,我们在找到m,n的值以后还要对数量进行统计,看是否超过,如果是,则输出。
【源代码】
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
N = len(nums)
m = n = cm = cn = 0
for num in nums:
if num == m:
cm += 1
elif num == n:
cn += 1
elif cm == 0:
m = num
cm = 1
elif cn == 0:
n = num
cn = 1
else:
cm -= 1
cn -= 1
cm = cn = 0
for num in nums:
if num == m:
cm += 1
elif num == n:
cn += 1
res = []
if cm > N / 3:
res.append(m)
if cn > N / 3:
res.append(n)
return res
复制代码