📅  最后修改于: 2023-12-03 15:12:41.721000             🧑  作者: Mango
在一个长度为n的无序整数数组中,查找是否存在任意一个数字出现了超过n/2的次数。如果存在则返回该数字,否则返回-1。
这道题可以使用摩尔投票算法,该算法的核心思想是通过消除不同元素之间的数量关系来求出数量超过半数的元素。
算法步骤如下:
时间复杂度为 O(n),空间复杂度为 O(1)。
def majority_element(nums: List[int]) -> int:
candidate = nums[0]
count = 1
for num in nums[1:]:
if num == candidate:
count += 1
else:
count -= 1
if count == 0:
candidate = num
count = 1
if nums.count(candidate) > len(nums) / 2:
return candidate
else:
return -1
public int majorityElement(int[] nums) {
int candidate = nums[0];
int count = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] == candidate) {
count++;
} else {
count--;
if (count == 0) {
candidate = nums[i];
count = 1;
}
}
}
count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == candidate) {
count++;
}
}
if (count > nums.length / 2) {
return candidate;
} else {
return -1;
}
}
摩尔投票算法是一种高效的算法,可用于求数组中数量超过半数的元素。要记住该算法的核心思想,以及步骤和时间复杂度。