- LeetCode的思路演绎
- 算法思路
题意:必存在众数 -》 在一个数组中,有一个数拥有找过一半的占有率,这个数记为A
若A和其他数组中的数进行选举,投票人只能是数组中的数。则A必赢(因为人数上已经过半)。
解题的关键就是:找到票数最高的人。
- 改动LeetCoded的演绎
/**
* @Author james
* @Date 2019/7/10
* @Description 求数组中的众数 - Boyer-Moore投票法
*/
public class Solution3 {
public int majorityElement(int[] nums) {
// 数组第一个数就是候选人,肯定给自己投票,票数为1
int ret = nums[0];
int power = 1;
// 只有一个人,票数投给自己,直接成为众数
if (nums.length == 1) {
return ret;
}
/*
从第一个数后面开始投票,表决前一个数是否应该成为候选人。
数值相等票数 +1 数值不等票数-1, 即不认为上一个人应该成为候选人。
将上一个候选人的票数清零,自己可以成为候选人,拥有获得多一票的权利。
遍历的过程中,数A必然成为候选人,而且任由除A数外所有人反对,票数到最后一定是正数。
正数不清零,到最后则为最终候选人。
*/
for (int i = 1; i < nums.length; i++) {
if (nums[i] == ret)
power++;
else
power--;
// 新晋候选人
if(power == 0){
ret = nums[i];
power = 1;
}
}
return ret;
}
}
- 复杂度
需要遍历数组的所有元素,时间复杂度为O(n)
没有随着数据量增大而变多的变量,空间复杂度为O(1)
是本题的最佳解法