1. 程式人生 > >《劍指offer29——陣列中出現次數超過一半的數字》

《劍指offer29——陣列中出現次數超過一半的數字》

題目描述:

 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。

例如:

輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

解法一:

思路解析:

        如果陣列排序,則出現次數超過陣列長度一半的數字一定會出現在陣列的中間位置,因此利用快速排序一趟歸位一個元素的思想,我們只需要找到陣列中間的那個數,並且判斷它的出現次數是否滿足就可以了。

public class Solution {
        /**
	 * 《《陣列中出現次數超過一半的數字-——解法一》》
	 * @param array
	 */
	public static int MoreThanHalfNum_Solution(int [] array) {
		
		//判斷邊界條件
		if(array == null || array.length<=0)
			return 0;
		//根據快速排序一趟歸位一個元素的思想,確定陣列的中間元素
		int midOfNum = getMiddleNumOfArray(array,0,array.length-1,array.length/2);
		//獲取中間元素的出現次數是否超過一半
		boolean isMoreThanHalf = checkMoreThanHalf(midOfNum,array);
		if(isMoreThanHalf)
			return midOfNum;
		else
			return 0;
        }
	/**
	 * 獲取陣列排序後的中位數
	 * @param array 陣列
	 * @param start 陣列開始下標
	 * @param end 陣列結束下標
	 * @param middle 中間座標
	 */
	public static int getMiddleNumOfArray(int[] array,int start,int end,int middle){
		
		int i=start,j=end;
		if(start<end){
			int temp = array[start];
			while(i!=j){
				while(i<j && array[j]>=temp)
					j--;
				array[i]=array[j];
				while(i<j && array[i]<=temp)
					i++;
				array[j]=array[i];
			}
			array[i]=temp;
		}
		//判斷i是否為陣列中位數
		if(i==middle)
			return array[i];
		else if(i<middle){
			return getMiddleNumOfArray(array, i+1, end, middle);
		}else{
			return getMiddleNumOfArray(array, start, i-1, middle);
		}
	}
	/**
	 * 判斷該數字是否在陣列中出現的次數超過一半
	 * @return
	 */
	public static boolean checkMoreThanHalf(int middleOfNum,int[] array){
		int count=0;
		for(int i=0;i<array.length;i++){
			if(array[i]==middleOfNum)
				count++;
		}
		if(count > array.length/2)
			return true;
		else
			return false;
	}
} 

解法二:

思路解析:

        在遍歷陣列的時候儲存兩個值:一個是陣列中的一個數字,一個是次數。當我們遍歷到下一個數字的時候,如果下一個數字和我們之前儲存的數字相同,則次數加1;如果不相同,則次數減1;如果次數為0,則需要將下一個數字儲存,並把次數設為1.則最終儲存的數字即為所求

public class Solution {
       /**
	 * 《《陣列中出現次數超過一半的數字-——解法二》》
	 * @param array
	 */
	public static int MoreThanHalfNum_Solution(int [] array){
		//判斷邊界條件
		if(array == null || array.length<=0)
			return 0;
		// 結果儲存在result,次數設為0
		int result=array[0],count=1;
		for(int i=0;i<array.length-1;i++){
			if(array[i+1] == array[i]){
				count++;
			}else if(count>0){
				count--;
			}else {
				result=array[i+1];
			}
		}
		//判斷是否符合要求
		boolean isMoreThanHalf = checkMoreThanHalf(result,array);
		if(isMoreThanHalf)
			return result;
		else
			return 0;
	}
       /**
	 * 判斷該數字是否在陣列中出現的次數超過一半
	 * @return
	 */
	public static boolean checkMoreThanHalf(int middleOfNum,int[] array){
		int count=0;
		for(int i=0;i<array.length;i++){
			if(array[i]==middleOfNum)
				count++;
		}
		if(count > array.length/2)
			return true;
		else
			return false;
	}
}