主元素就是出现次数大于数组总书目的一半。
时间复杂度要求O(N)
思路是扫描一遍数组,利用主元素出现次数大于一半,即用出现的次数减去未出现的次数,最后还是应该是大于0,一切小于0的都抛弃。最后得到可疑的一个主元素。
再进行一遍遍历,确定可疑主元素的出现次数,大于一半就是主元素。
public class MainElement
{
public static void main(String[] args){
int[] arr1 = new int[]{4,5,4,3,3,4,5,4,6,4,6,4,3,4,4}; //有主元素4
int[] arr2 = new int[]{4,5,4,3,3,4,5,9,6,4,6,8,3,4,4}; //没有主元素
int[] arr3 = new int[]{5,5,4,3,3,4,5,9,6,4,6,8,3,4,4}; //没有主元素
int[] arr4 = new int[]{5,4}; //没有主元素
int[] arr5 = new int[]{5}; //有主元素5
search(arr1);
search(arr2);
search(arr3);
search(arr4);
search(arr5);
}
public static void search(int[] arr){
int times = 0; //定义出现次数
int mainEl = 0; //定义可疑主元素
for (int i = 0; i < arr.length ; i++ ) //找到可疑主元素
{
if (times == 0)
{
mainEl = arr[i];
times = 1;
continue;
}
if (mainEl == arr[i])
{
times ++;
}
else
{
times --;
}
}
int num = 0; //遍历数组,找可疑主元素的出现次数
for (int i : arr)
{
if ( mainEl == i)
{
num ++;
}
}
if (num > arr.length / 2) //大于一半为主元素
{
System.out.println("主元素:" + mainEl);
}
else{
System.out.println("没有主元素");
}
}
}