题目
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
举例:输入一个长度为9的数组{1,2,3,2,2,2,5,4,2},由于数字2在数组中出现了5次,超过数组长度一半,因此输出2。
思路:摩尔投票法
遇到不相同的pair就删除它们,最后留下的就是超过半数的数字。
具体方案,维护一个major和count
摩尔投票算法可以快速的计算出一个数组中出现次数过半的数即大多数(majority),算法核心思想是同加,异减。我们举个例子。
假设数组是:[1,2,1,1,2,1]。算法步骤如下:
1。当前大多数是1,得分置1
2。与当前大多数不同,得分 - 1,得分为0,当前大多数 = 1
1。与当前大多数不同,得分为0,所以设置当前大多数 1 -> 1,得分置1
1。与当前大多数相同,得分 + 1,得分为2,当前大多数 = 1
2。与当前大多数不同,得分 - 1 ,得分为1,当前大多数 = 1
1。与当前大多数相同,得分 + 1,得分为2,当前大多数 = 1
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] number = new int[n];
for(int i=0;i<n;i++){
number[i] = in.nextInt();
}
if(n==0||number==null)
System.out.println("输入错误");
int major = number[0];
int count = 1;
for(int i=1;i<n;i++){
if(count==0){
major = number[i];
count++;
}else{
if(major == number[i])
{
count++;
}else{
count--;
}
}
}
if(count!=0){
System.out.println(major);
}else{
System.out.println("null");
}
}
}