Boyer-Moore Voting Algorithm
以题讲解
我们以 LeetCode 的 169. Majority Element 来讲解这个巧妙的算法吧。
在给定的 n
个数据中,至少存在 n / 2 + 1
个相同的数据,找出这个特殊的数据。
算法思想
这个算法的主要思想可以这样理解:
假设存在这样的一类棋牌游戏,有黑白两棋,其中有一方的数量至少比对方多一个,这类棋牌游戏只能采用一对一的同归于尽玩法,那么剩下的就是胜方。(牛逼游戏!!)
我们这里的 n
个数据也采用同样的方式,至少 n / 2 + 1
个相同的数据的为甲方,其他的数据为乙方,双方采用同归于尽法,剩下的就是我们想要的特殊数据了。
代码实现
此算法的思想就是这样子,下面用代码实现一下:
/**
* @param {number[]} nums
* @return {number}
*/
let getSpecialData = (nums) => {
let count = 0;
let result = 0;
for (let num of nums) {
if (count === 0) {
result = num;
}
count += num === result ? 1 : -1;
}
return result;
}
总结
Boyer-Moore Voting Algorithm 使用范围优先。