1. 程式人生 > >劍指Offer刷題筆記(java實現)_39.陣列中次數超過一半的數字

劍指Offer刷題筆記(java實現)_39.陣列中次數超過一半的數字

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

例如輸入陣列:{1,3,3,2,3,2,3,3,2}。由於2在陣列中出現了5次,超過陣列長度的一半,因此要輸出2。

三種解法:

第一種遍歷陣列,利用hashMap儲存每個數字出現的次數,時間複雜度O(n)

第二種:如果一個數組排好序,並且這個陣列中有一個數字超過陣列的一半,那麼位於中間位置的一定是這個數

第三種:我們這麼想,當一個數組中一個數字超過陣列的一半,那麼這個數字的個數減去其他數字個數的總和>0

    第三種:

   思路:我們設定兩個數字,一個數字是用來儲存當前記錄的數字,一個數字是用來記錄當前數字的個數

 從第一個數字算起,如果下一個數字還是這個數字,那麼給記錄的數字++,如果不是這個數字則--。當記錄個數的數字減到了0,那麼相當於這個數字肯定不會超過這個陣列的一半,因此將記錄的數字轉為下一個數字,重複這樣的步驟。

其實就相當於抵消。

     //方法3:
    public static int beyondArrayHalfMethodThree(int[] arr){
           int recordTimes=1;//記錄的次數
           int recordNum=arr[0];//記錄的數字
        for (int i = 1; i <arr.length ; i++) {
            if (recordTimes==0){//如果記錄的次數被抵消到0了,我們就記錄當前遍歷的數字
                  recordNum=arr[i];
            }
            if (arr[i]==recordNum){
                recordTimes++;
            }
           else if (arr[i]!=recordNum){//如果下一個數字和記錄不同
                recordTimes--;
            }
        }
        return recordNum;

    }
}