已知一个整数序列 A=(a0,a1,…an-1),其中 0≤ai<n(0≤i<n).若存在ap1=ap2=…=apm=x 且
m>n/2(0≤pk<n,1≤k≤m),则称 x 为 A 的主元素,例如 A=(0,5,5,3,5,7,5,5),则 5 为主元素;又如 A=(0,5,5,3,5,1,5,7),则 A 中没有主元素。假设 A 中 的 n 个元素保存在一个一维数组中,请计一个尽可能高效的算法,找出 A的主元素。若存在主元素,则输出该元素;否则输出-1。
思路:定义一个count记录候选主元素个数,用k记录此时的候选主元素,当该元素与下一个元素不同时,个数减1,如果相同则加1,如果count减到0,则k记录当前元素的下一个元素,count重置成1,如此遍历一遍数组,找出重复最多的元素,再遍历一遍数组统计主元素的个数,判断是否超过一半,然后输出。
不一样的对拼抵消
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("要输入的数字个数为:");
int n=sc.nextInt();
int[] arry=new int[n];
for (int i=0;i<n;i++){
arry[i]=sc.nextInt();
}
System.out.println(moerVote(arry,n));
}
static int moerVote(int[] arry,int n){
int count=1,k=arry[0];
for (int i=1;i<n;i++){
if (count>0){
if(k==arry[i]){
count++;
}else {
count--;
}
}else {
k=arry[i];
count=1;
}
}
for(int i=count=0;i<n;i++){
if(arry[i]==k){
count++;
}
}
if(count>(n/2)){
return k;
}else return -1;
}
}