算法背景:
Boyer-Moore majority vote algorithm(摩尔投票算法)是一种在线性时间O(n)和空间复杂度的情况下,在一个元素序列中查找包含最多的元素。
它是以Robert S.Boyer和J Strother Moore命名的,1981年发明的,是一种典型的流算法(streaming algorithm)。
在它最简单的形式就是,查找最多的元素,也就是在输入中重复出现超过一半以上(n/2)的元素。
如果序列中没有最多的元素,算法不能检测到正确结果,将输出其中的一个元素之一。
算法介绍
- 基本题目形式为:找出数组中出现次数超过一半的数字
- 核心理念为 “正负抵消” ;
- 时间和空间复杂度分别为 O(N) 和O(1) ;
算法理解
- 正负抵消
对于正负抵消的理解为消除相异的数字。
因为存在出现次数超过一半的数字,该数字个数必定大于等于与其不同的数字个数。
所以,将参照数字与与其不同的数字抵消。如此,最后留下的一个必定是出现次数最多的(若存在)。 - 抵消方式:
设置计数器,当前比较对象若与参照对象相同,则+1,若不同,则-1。抵消成0时将下一个数字作为新参照。
LeetCode上图解