一、什么是摩尔投票
先看一个问题:求出数组中占比超过一半的数字
这个问题首先暴力的话就是俩层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
}