📌  相关文章
📜  在 O(n) 时间和 O(1) 额外空间中找到最大重复数(1)

📅  最后修改于: 2023-12-03 14:51:03.326000             🧑  作者: Mango

在 O(n) 时间和 O(1) 额外空间中找到最大重复数

在给定的数组中,可能会有多个数字出现了多次。现在我们需要在 O(n) 的时间内,使用 O(1) 的额外空间找到其中出现次数最多的数字。

思路

对于这道题,我们可以使用摩尔投票法(Boyer-Moore Voting Algorithm)来实现。该算法基于以下两个事实:

  • 如果一个数字出现的次数超过一半,则该数字在遍历整个数组时一定会出现超过一半的次数。
  • 如果两个不同的元素相互抵消,则可以从数组中删除这两个元素,并且结果不受影响。

因此,我们可以在遍历数组时使用两个变量,一个用来保存当前出现最多的数字,另一个用来保存当前数字出现的次数。如果当前数字和最多数字相同,则次数加一;否则,次数减一。如果次数为零,则更新最多数字为当前数字,并将次数重置为一。最终留下的数字就是出现次数最多的数字。

代码实现
public int majorityElement(int[] nums) {
    int count = 0;
    int major = 0;
    for (int num : nums) {
        if (count == 0) {
            major = num;
        }
        count += (num == major) ? 1 : -1;
    }
    return major;
}
时间复杂度

遍历数组一次,因此时间复杂度为 O(n)。

空间复杂度

只使用了两个额外变量,因此空间复杂度为 O(1)。