主元素就是出現次數大於數組總書目的一半。
時間複雜度要求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("沒有主元素");
}
}
}