摩尔投票算法

摩尔投票算法认定的事实


每次从序列里选择两个不相同的数字相抵消,最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。


上面就是摩尔投票算法认定的事实。基于以上事实,编写摩尔投票算法代码。

思路

对于一个序列,先维护一个默认主要元素major(可为任意值)和一个主要元素计数count(初始化为0)。
遍历这个序列:
如果count为0,则说明还没有找到主要元素,则可把当前元素当作主要元素,同时count累加1,

if(count == 0)
{
	major = nums[i];
	count += 1;
}

继续遍历,如果count不为0且当前元素和major相等,则count累加1;
如果count不为0且当前元素和major不相等,则该元素可以和major“抵消”,则count 累减1,

else if (nums[i] == major) {
	count += 1;
} else {
	count -= 1;
}

最后返回major即为序列的主要元素。
对于序列中不存在主要元素情况,只需在代码中重新遍历数组,所有元素与major对比并计数count,相等则累加1,最后count*2大于序列长度即可认定major为序列主要元素。

完整代码

public int majorityElement(int[] nums) {
    	int n = nums.length;
    	int major = -1;
    	int count = 0;
    	
    	for (int num : nums) {
    		if (count == 0) {
    			major = num;
    			count++;
    		} else {
    			if (num == major) {
        			count++;
        		} else {
        			count--;
        		}
    		}
    	}
    	
    	count = 0;
    	for (int num : nums) {
    		if (major == num) {
    			count ++;
    		}
    	}
    	
    	if (count*2 > n) {
    		return major;
    	} else {
    		return -1;
    	}
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值