摩尔投票算法
思路
算法首先将数组的第一个元素作为候选众数,并设置初始计数为1。然后,遍历数组中的每个元素,如果当前元素等于候选众数,则增加计数,否则减少计数。当计数降为0时,算法更换候选众数为当前元素,并重置计数。最终,候选众数即为超过一半的数。
原理
这个算法之所以有效,是因为多数元素的出现次数一定超过其他所有元素的出现次数之和。通过不断抵消不同的元素,最终候选众数将是多数元素。
C++实现
cpp
#include <iostream>
#include <vector>
int findMajorityElement(std::vector<int>& nums) {
int majority = nums[0]; // 候选的众数
int count = 1; // 候选众数的计数
for (int i = 1; i < nums.size(); ++i) {
if (nums[i] == majority) {
// 如果当前元素等于候选众数,则增加计数
++count;
} else {
// 如果当前元素不等于候选众数,则减少计数
--count;
if (count == 0) {
// 当计数降为0时,更换候选众数为当前元素
majority = nums[i];
count = 1;
}
}
}
// 最终的候选众数即为超过一半的数
return majority;
}
int main() {
std::vector<int> nums = {2, 2, 1, 1, 1, 2, 2};
int majorityElement = findMajorityElement(nums);
std::cout << "Majority Element: " << majorityElement << std::endl;
return 0;
}
复杂度
摩尔投票算法的时间复杂度为O(n),其中n是数组的长度,因为它只需要遍历数组一次。这使得它成为在大型数据集中找到多数元素的高效方法。