問題:數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。數組
分析:看到此題第一反應就是將數組中的數字進行排序,而後統計數字出現的次數。排序的時間複雜度爲O(nlogn)。spa
從另外一個角度出發,數組中有一個數字出現的次數大於數組長度的一半,也就是說它出現的次數比其餘數字出現次數之和還要多。所以能夠在遍歷數組的時候保存兩個值:(1)保存數組中的值;(2)保存數字出現的次數。code
步驟:(1)當遍歷的下一個數字與以前保存的數字不一樣時, 將次數減1;blog
(2)當遍歷的下一個數字與以前保存的數字相同時, 將次數加1;排序
(3)當次數爲0時,保存下一個遍歷的數字,而且次數置爲1。class
因爲咱們要找的數字比其餘數字出現的次數之和還要多,那麼要找的數字確定是最後一次將次數置爲1的數字。遍歷
package com.wyl; /** * 尋找數組中出現次數超過數組長度通常的數組 * @author wyl * */
public class MoreThanHalfNum { /** * 遍歷數組的時候保存兩個值:一個是數組中的值,一個爲次數 * 遍歷數組,若是遍歷的下一個數字和以前保存的值不同時, 次數減1; * 若是和以前保存的值相同的時候,次數加1; * 若是次數爲0時,保存下一個數字,而且次數設爲1 * */
public int moreThanHalfNum(int[] array, int length){ if(array == null || length <= 0){ //輸入的數組非法
return 0; } int number = 0; //保存數組中的一個數字
int count = 0; //保存數字出現的次數
for(int i=0;i<length;i++){ if(count == 0){ number = array[i]; count = 1; }else if(array[i] == number){ count++; }else{ count-- ; } } if(!checkNumMoreThanHalf(array, length, number)){ return 0; } return number; } /** * 檢查數字number在數組array中出現的次數是否大於通常 * @param array * @param length * @param number * @return
*/
private boolean checkNumMoreThanHalf(int[] array, int length, int number) { // TODO Auto-generated method stub
boolean isMoreThanHalf = true; int count = 0; for(int i=0;i<length;i++){ if(array[i] == number){ count++; } } if(count*2 <= length){ isMoreThanHalf = false; } return isMoreThanHalf; } public static void main(String[] args) { MoreThanHalfNum moreThanHalfNum = new MoreThanHalfNum(); int[] a = {1,0,3,0,0,0,5,4,0,3}; int num = moreThanHalfNum.moreThanHalfNum(a, a.length); System.out.println(num); } }