巧用摩尔投票算法解数组中出现次数超过一半的数字

摩尔投票法(Boyer–Moore majority vote algorithm)用于从数组中找出出现次数超过一半的数字。算法通过两两对抗抵消不同数字,最终找出剩下的一位候选人。例如在数组[1,2,3,2,2,2,5,4,2]中,2出现了5次,超过数组长度一半,因此输出2。如果不存在这样的数字则输出0。本文通过实例解析算法思路,并提供Java代码实现。" 79922306,7565847,C++17:利用构造函数推导模板类型,"['C++', '编程语言特性', '模板编程', 'C++17新特性']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摩尔投票法介绍

摩尔投票法(Boyer–Moore majority vote algorithm),也被称作「多数投票法」,算法解决的问题是:如何在任意多的候选人中(选票无序),选出获得票数最多的那个。
算法可以分为两个阶段:
对抗阶段:分属两个候选人的票数进行两两对抗抵消
计数阶段:计算对抗结果中最后留下的候选人票数是否有效

假设投票是这样的,[A, C, A, A, B],ABC是指三个候选人。
第一张票与第二张票进行对坑,如果票不同则互相抵消掉;
接着第三票与第四票进行对坑,如果票相同,则增加这个候选人的可抵消票数;
这个候选人拿着可抵消票数与第五张票对坑,如果票不同,则互相抵消掉,即候选人的可抵消票数-1。

下面咱们举个例子来帮助我们理解什么是摩尔投票法。

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。题目链接

示例:
输入: [2,2,1,3,1,2,2]
输出: 2

解题思路

以 [2,2,1,3,1,2,2] 为例进行分析。

先初始化候选人,将第一个元素赋值给candidate,且票数为0

在这里插入图片描述

遍历第一个元素时,candidate=2,与初始值相等,所以票数count+1,即count=1

在这里插入图片描述

当遍历到第二个元素2时,与candidate相同,所以candidate仍然为2,且票数+1。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值