寻找一个数组中的主元素

主元素就是出现次数大于数组总书目的一半。


时间复杂度要求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("没有主元素");	
			}
			
		}
}




发布了36 篇原创文章 · 获赞 0 · 访问量 4979
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章