题目
链接
思路
摩尔投票: 首先请考虑最基本的摩尔投票问题,找出一组数字序列中出现次数大于总数1/2的数字(并且假设这个数字一定存在)。显然这个数字只可能有一个。摩尔投票算法是基于这个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。
图解模拟摩尔投票
视频讲解
- count为当前元素个数,major当前存活值
- count=0:
说明前面的数可以组成两两不同的一对数进行抵消完毕
从新确定 count=1 major=x- coun!=0 :
1. major==x count++
2. major1=x count–- 证明摩尔投票
代码
public class Main {
public static void main(String[] args) {
int[] arr=new int[]{1,2,3,2,2,2,5,4,2};
System.out.println(moreThanHalfNum(arr));
}
public static int moreThanHalfNum(int[] array){
int count=0;
int major=0;
for(int x:array){
if(count==0){
major=x;
count=1;
}else{
if(major==x){
count++;
}else{
count--;
}
}
}
int times=0;
for(int x:array){
if(major==x){
times++;
}
}
if(times>array.length/2){
return major;
}
return 0;
}
}
复杂度
时间复杂度: O(n)
空间复杂度: O(1)