摩尔投票算法(Moore's Voting Algorithm)及例题
上午打力扣第 354 场周赛最后十五分钟用摩尔投票算法直接秒了第三题。
摩尔投票算法简介
摩尔投票算法最早由 Robert S. Boyer 和 J Strother Moore 在 1981 年的论文 “MJRTY—A Fast Majority Vote Algorithm” 中提出。这篇论文描述了摩尔投票算法的原理和证明,并展示了它在实际应用中的高效性。
论文的引用信息如下:
Title: MJRTY—A Fast Majority Vote Algorithm
Authors: Robert S. Boyer, J Strother Moore
Year: 1981 Published in: Automated
Reasoning: Essays in Honor of Woody Bledsoe
Publisher: Springer-Verlag
Pages: 105-117
具体算法证明大家可以去查看相关论文
摩尔投票算法算法思想
摩尔投票算法(Moore’s Voting Algorithm)是一种用于在数组中寻找多数元素的有效方法。所谓多数元素,是指在数组中出现次数超过一半以上的元素。最经典的例子就是用于众数的寻找。
摩尔投票算法的基本思想很简单,它通过消除不同元素之间的对抗来找到可能的多数元素。算法遍历数组并维护两个变量:候选元素和其对应的票数。开始时,候选元素为空,票数为0。然后对于数组中的每个元素,执行以下步骤:
- 如果票数为0,将当前元素设为候选元素,并将票数设置为1。
- 如果当前元素等于候选元素,则票数加1。
- 如果当前元素不等于候选元素,则票数减1。
这样做的效果是,相同元素的票数会相互抵消,不同元素的对抗也会导致票数减少。由于多数元素的出现次数超过一半以上,所以最终留下的候选元素就很有可能是多数元素。
遍历完整个数组后,候选元素即为多数元素的候选者。然后我们需要进一步验证候选元素是否真的是多数元素,因为可能存在没有多数元素的情况。我们再次遍历数组,统计候选元素的出现次数,如果发现它的出现次数超过了一半以上,则确认它为多数元素;否则,表示没有多数元素。
以下是摩尔投票算法的伪代码:
function findMajorityElement(nums):
candidate = None
count = 0
for num in nums:
if count == 0:
candidate = num
if candidate == num:
count += 1
else:
count -= 1
# 进行第二次遍历,验证 candidate 是否为多数元素
count = 0
for num in nums:
if num == candidate:
count += 1
if count > len(nums) / 2:
return candidate
else:
return None
摩尔投票算法的时间复杂度为O(n),空间复杂度为O(1),是一种高效的寻找多数元素的算法。
摩尔投票算法经典题目
169. 多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

解题思路:
直接摩尔投票算法秒了
class Solution {
public:
int majorityElement(vector<int>& nums

最低0.47元/天 解锁文章
479

被折叠的 条评论
为什么被折叠?



