题目:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
思想:摩尔投票法(Boyer–Moore majority vote algorithm),也被称作「多数投票法」,算法解决的问题是:如何在任意多的候选人中(选票无序),选出获得票数最多的那个。
该算法的原理是:每次从序列里选择互不相同的两个数字,将它们删除掉也可以称之为“抵消”掉,最后剩下一个数字或几个相同的数字,我们要找的多数元素。
举个例子:玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。
那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。
最后能剩下的必定是自己人。
class Solution10 {
public int majorityElement(int[] nums) {
int temp = nums[0],index=1;
for (int i = 1; i < nums.length; i++) {
if(index!=0){
if(nums[i]==temp){
index++;
}else {
index--;
}
}else {
temp=nums[i];
index=1;
}
}
return temp;
}
}