摩尔投票法寻找众数

要求:输入一个整数数组,找出其中所有出现超过 n/2或者n/3 次的元素并返回。(众数未必存在)

摩尔投票法

摩尔投票法的基本思想是,在每一轮投票过程中,从数组中找出一对不同的元素,将其从数组中删除。这样不断的删除直到无法再进行投票,如果数组为空,则没有任何元素出现的次数超过该数组长度的一半。如果只存在一种元素,那么这个元素则可能为目标元素。

寻找数组中出现个数超过n/2的众数

首先来考虑最简单的情况,寻找个数大于n/2(下取整)的元素,如果存在这样的元素,那么有且只有一个,不能存在两个个数大于n/2个不同的元素,仅这两个元素个数加起来就大于n了。假设如果存在满足条件的众数,从数组中删去不相同的两个元素,不断重复,那么剩下的那个元素就是众数。最差的情况是每次删去的两个元素刚好是一个非众数和一个众数,如果删去的元素是两个非众数,那剩下众数个数相对变多,因为众数个数大于n/2,这样到最后剩下的元素就是众数(如果存在众数),因为他未必存在众数,因此对这个元素进行遍历,来确定其个数是否大于n/2。
举两个简单例子7个元素的数组,众数的个数至少是4,如{1,2,1,3,1,4,1},当遇见两个不同元素就删除,先删除{1,2},再删除{1,3},{1,4}。最后剩下元素1。如果是{1,2,3,4,1,1,1}最后会剩下{1,1,1}。如果是8个元素,众数个数至少为5个,非众数最多就为3个。
具体的算法如下,先用将数组第一个元素赋值给value,计数器初始化为0,遍历整个数组,先检查count1的值,如果为0就重置value的值,并置计数器为1,count1不为0的话,如果和value相等就加一,不等就减一。重复直到遍历结束,用计数器count2来计数数组中值为value的元素个数,来检查是否大于n/2.Java代码如下:


```java
import java.util.Scanner;
public class lookformass {
   
	public static void main(String[] args) {
   
		// TODO Auto-generated method stub
		 Scanner input = 
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值