摩尔投票算法认定的事实
每次从序列里选择两个不相同的数字相抵消,最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。
上面就是摩尔投票算法认定的事实。基于以上事实,编写摩尔投票算法代码。
思路
对于一个序列,先维护一个默认主要元素major(可为任意值)和一个主要元素计数count(初始化为0)。
遍历这个序列:
如果count为0,则说明还没有找到主要元素,则可把当前元素当作主要元素,同时count累加1,
if(count == 0)
{
major = nums[i];
count += 1;
}
继续遍历,如果count不为0且当前元素和major相等,则count累加1;
如果count不为0且当前元素和major不相等,则该元素可以和major“抵消”,则count 累减1,
else if (nums[i] == major) {
count += 1;
} else {
count -= 1;
}
最后返回major即为序列的主要元素。
对于序列中不存在主要元素情况,只需在代码中重新遍历数组,所有元素与major对比并计数count,相等则累加1,最后count*2大于序列长度即可认定major为序列主要元素。
完整代码
public int majorityElement(int[] nums) {
int n = nums.length;
int major = -1;
int count = 0;
for (int num : nums) {
if (count == 0) {
major = num;
count++;
} else {
if (num == major) {
count++;
} else {
count--;
}
}
}
count = 0;
for (int num : nums) {
if (major == num) {
count ++;
}
}
if (count*2 > n) {
return major;
} else {
return -1;
}
}