📌  相关文章
📜  查找发生超过⌊N3⌋次的所有数组元素(1)

📅  最后修改于: 2023-12-03 15:40:23.359000             🧑  作者: Mango

查找发生超过 ⌊N/3⌋ 次的所有数组元素

本文介绍如何寻找一个长度为 N 的数组中,出现次数超过 ⌊N/3⌋ 的所有元素。

暴力解法

我们可以暴力枚举数组中的每个元素,再依次遍历整个数组计算出该元素的出现次数。如果出现次数超过 ⌊N/3⌋,则将该元素加入答案数组。

def findMajority(nums: List[int]) -> List[int]:
    n = len(nums)
    res = []
    for x in set(nums):
        if nums.count(x) > n // 3:
            res.append(x)
    return res
摩尔投票算法

我们也可以使用摩尔投票算法来解决这个问题。

摩尔投票算法的基本思路是,维护一个候选众数,遍历数组时如果遇到与候选众数不同的元素,则将候选众数个数减一,否则将其个数加一。当候选众数个数为零时,重新选择候选众数。

以下是该算法的代码实现:

def findMajority(nums: List[int]) -> List[int]:
    n = len(nums)
    cnt1, cnt2, num1, num2 = 0, 0, None, None
    for num in nums:
        if num == num1:
            cnt1 += 1
        elif num == num2:
            cnt2 += 1
        elif cnt1 == 0:
            num1, cnt1 = num, 1
        elif cnt2 == 0:
            num2, cnt2 = num, 1
        else:
            cnt1 -= 1
            cnt2 -= 1
    res = []
    if nums.count(num1) > n // 3:
        res.append(num1)
    if nums.count(num2) > n // 3:
        res.append(num2)
    return res
总结

本文介绍了两种查找出现频率超过 ⌊N/3⌋ 的所有元素的方法——暴力和摩尔投票算法。其中,摩尔投票算法的时间复杂度为 O(N),空间复杂度为 O(1)。