给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
示例 1:
输入:[3,2,3]
输出:[3]
示例 2:
输入:nums = [1]
输出:[1]
示例 3:
输入:[1,1,1,3,3,2,2,2]
输出:[1,2]
提示:
1 <= nums.length <= 5 * 104
-109 <= nums[i] <= 109
思路:摩尔投票法,分为两盒阶段:配对阶段和计数阶段。
如果至多选一个代表,那他的票数至少要超过一半(⌊ 1/2 ⌋)的票数;
如果至多选两个代表,那他们的票数至少要超过 ⌊ 1/3 ⌋ 的票数;
如果至多选m个代表,那他们的票数至少要超过 ⌊ 1/(m+1) ⌋ 的票数。
code:
import math
class Solution:
def majorityElement(self, nums: List[int]) -> List[int]:
candidates = [nums[0], nums[0]]
count = [0, 0]
# 摩尔投票法,分为两盒阶段:配对阶段和计数阶段
# 配对阶段
for num in nums:
# 投票
if candidates[0] == num:
count[0] += 1
continue
if candidates[1] == num:
count[1] += 1
continue
# 和第一个人配对
if count[0] == 0:
candidates[0] = num
count[0] += 1
continue
# 和第二个人配对
if count[1] == 0:
candidates[1] = num
count[1] += 1
continue
count[0] -= 1
count[1] -= 1
# 计数阶段
count1, count2 = 0, 0
ans = []
for num in nums:
if num == candidates[0]:
count1 += 1
elif num == candidates[1]:
count2 += 1
if count1 > math.floor(len(nums) / 3):
ans.append(candidates[0])
if count2 > math.floor(len(nums) / 3):
ans.append(candidates[1])
return ans