摩尔投票

一、什么是摩尔投票

先看一个问题:求出数组中占比超过一半的数字
这个问题首先暴力的话就是俩层for,一个O(n2)的时间复杂度,那么如果要求时间复杂度为O(n)的话,该怎么解呢?
这时候就要用到摩尔投票,摩尔投票本质就是摩尔投票算法是基于数字序列中出现次数大于总数1/2的数字只有一个这个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。

二、怎么实现

要实现这个算法,我们实际只要维护俩个变量major和count就可以了,major保存当前的数字,count用于记录当前这个数字出现的次数。
例如求数组{1,2,1,1,1,4}中出现的占比超过一半的数字
第一轮:major=1,count=1
第二轮:count不为0,因此判断nums[1] (值为2)不等于major,因此count- -置为0,相当于1和2抵消了
第三轮:由于count为0,所以直接给major赋值为1,count=1
第四轮:count不为0,判断major于nums[2](值为1)相等,因此count++
后面依次类推,先判断count值,再给major和count赋值
最后得到major和count值,如果count为1别忘了最后要检验一下,因为如果数组里面有奇数个元素且无摩尔数,最后major就是最后一个元素,代码如下:

func majorityElement(nums []int) int {
	var major int
	count := 0
	for i := 0; i < len(nums); i++ {
		if count == 0 {
			major = nums[i]
			count++
			continue
		}
		if major == nums[i] {
			count++
		} else {
			count--
		}
	}
	if count > 0 {
		var num int = 0
		for i := 0; i < len(nums); i++ {
			if nums[i] == major {
				num++
			}
		}
		if num > len(nums)/2 {
			return major
		}
	}
	return -1

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值