劍指Offer刷題筆記(java實現)_39.陣列中次數超過一半的數字
阿新 • • 發佈:2018-12-14
陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。
例如輸入陣列:{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; } }