📅  最后修改于: 2023-12-03 14:51:03.326000             🧑  作者: Mango
在给定的数组中,可能会有多个数字出现了多次。现在我们需要在 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)。