投票算法主要用于解决数组中出现次数最多的元素问题。
投票算法的理解主要是记住数组里只有两种元素:我和我之外的元素。
比如:有个数组{0,1,2,1,2,1}
用temp存储出现次数最多的元素,count计数。
1.首先用temp存储0,count赋初值为1。
2.开始从第二个元素遍历,此时1不等于0,那么就给count–,同时当count为0时将当前遍历的元素赋值给temp,将count++。(为什么要如此操作,因为:遍历到1时,1和0都出现了一次,那么我们可以认为0可能没有1出现的次数多,于是我们就可以将1赋值给temp,将1当作出现次数最多的数字,同时将count++变为1。)
3.继续遍历到2,参照第2步,将2赋值给temp,count继续初始化为1。
4.遍历到1,将1赋值给temp,count初始化为1。
5.遍历到2…
6.遍历到1,将1赋值给temp,count初始化为1。
到此遍历完毕我们将1输出,count实际上是不同元素出现次数的一个差值,出现次数最多的的元素其最后count必然是大于0的。
核心代码如下:
public static int majorityElement(int[] nums){
//投票算法
int count = 1;
int temp = nums[0];
for(int i = 1;i < nums.length;i++){
if(temp == nums[i]){
count++;
}else {
count--;
}
if(count == 0){
temp = nums[i];
count = 1;
}
}