《劍指offer29——陣列中出現次數超過一半的數字》
阿新 • • 發佈:2019-01-01
題目描述:
陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。
例如:
輸入一個長度為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; } }