难度:Medium ?:967
题目
给定大小为n的整数数组,找到所有出现超过n /3次的元素。
注意:算法应在线性时间和O(1)空间中运行。
思路
这样的数字最多有两个。
用BM投票法,设置两个计数器,遍历一遍数组。
当数字等于某一个计数器时,count += 1;
当其中一个计数器 count = 0时,可以用该数字初始化该计数器的值;
当数字不等于两个计数器的取值时,两个计数器都count -= 1;
最后,检查这两个计数器的值是否在数组中出现次数大于n /3次。
解答
class Solution:
def majorityElement(self, nums: List[int]) -> List[int]:
res = []
val1 = val2 = 0.5
count1 = count2 = 0
for num in nums:
if num == val1:
count1 += 1
elif num == val2:
count2 += 1
elif count1 == 0:
count1 += 1
val1 = num
elif count2 == 0:
count2 += 1
val2 = num
else:
count1 -= 1
count2 -= 1
count1 = 0
count2 = 0
for num in nums:
if num == val1:
count1 += 1
if num == val2:
count2 +=1
if count1 > len(nums)/3:
res.append(val1)
if count2 > len(nums)/3:
res.append(val2)
return res