1、摩尔投票算法是什么
- 摩尔投票算法(Moore's Voting Algorithm)是一种在数组或序列中查找出现次数超过一半的主要元素的算法,其中主要元素指的是在数组中出现次数超过数组长度一半的元素。关键思想是通过不同元素之间的抵消来找到可能的主要元素候选者,并在最后验证候选者是否真正满足要求。
2、摩尔投票算法的思想
- 让每对不同的数字互相“抵消”,就像投票一样。具体做法是,让两个不同的数字相互“消掉”,直到没有可以抵消的数字为止。最后剩下的数字就很有可能是出现次数最多的数字。
3、摩尔投票算法的基本原理
-
以诸侯争霸游戏为例,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。等同于最差的所有人都联合起来对付你(而你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要不要内斗,最后肯定你赢。
例如:
public class Solution169 {
public static void main(String[] args) {
int[] num1 = {2,2,1,1,1,2,2};
System.out.println(new Solution169().majorityElement(num1)); // 2
int[] num2 = {2,1,1,5,5,5,5,5,1,2,2,5,5,5,4,3,};
System.out.println(new Solution169().majorityElement(num2)); // 5
}
public int majorityElement(int[] nums) {
/*
// 方法1:数组排序
if(nums.length <=1){
return 0;
}
Arrays.sort(nums);
return nums[nums.length/2];*/
// 摩尔投票法
int index= nums[0];
int count = 1;
for(int i : nums){
if(i != index){
count--;
if(count == 0){
count = 1;
index = i;
}
}else{
count++;
}
}
return index;
}
}
4、福尔摩斯算法缺点
(1)、不适用于所有情况,算法要求主要元素的主要元素出现次数超过一半