求众数

求众数

给定一个数组大小n,求其中出现的次数严格大于n/3的元素
在这里插入图片描述
方法:摩尔投票法
步骤:

  1. 第一次遍历 需要找出数量出现最多的 两个数字;

  2. 第二次遍历 需要找出准确的出现次数,因为第一次遍历可能会漏掉一些次数;

  3. 最后,要检查次数大于 n/3 的 才算众数。

代码如下

class Solution {
    public List<Integer> majorityElement(int[] nums) {
      	List<Integer> list = new ArrayList<Integer>();
		int result1 = 0, result2 = 0, count1 = 0, count2 = 0;
		//若需找出大于n/m的数(即m-1个众数),则需各m-1个result和count
		for (int x : nums) {
			if (x == result1)
				count1++;
			else if (x == result2)
				count2++;
			else if (count1 == 0) {
				result1 = x;
				count1 = 1;
			} else if (count2 == 0) {
				result2 = x;
				count2 = 1;
			} else {
				count1--;
				count2--;
			}
		}                //此循环找出出现最多的两个众数(若为n/m,则找出m-1个众数)
		count1 = count2 = 0;
		for(int x : nums) {
			if(x == result1)
				count1++;
			if(x == result2)
				count2++;
		}               //此循环统计各众数出现的具体次数
		if(count1 > (nums.length/3))
			list.add(result1);
		if((count2 > (nums.length/3)) && (result2!=result1))
            list.add(result2);   //此判断众数是否合乎题干且是否重复
		return list;  
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值