數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。
例如輸入數組:{1,3,3,2,3,2,3,3,2}。由於2在數組中出現了5次,超過數組長度的一半,因此要輸出2。
有兩種解法:
第一種方法是基於快速排序算法的原理,邊排序邊判斷是否符合輸出條件。這種方法的代碼我因為沒有保存,在電腦藍屏之后全部消失了·······~~~~(>_<)~~~~ 嗚嗚。
第二種方法是根據數組特點找出的算法,時間復雜度為O(n),且不用改變數組本身結構。
思想是:如果一個數出現的次數超過數組一半的長度,那么就是說出現的次數比其他所有數字出現的次數還要多。因此我們可以考慮保存2個值,一個是數組中的一個數,一個是數的次數。當我們遍歷到下一個數字的時候,如果下一個數字和我們之前保存的數字相同,則次數加1,如果不同則次數減1。如果次數為0了這保存當前遍歷到的數,並把次數設為1。遍歷完整個數組之后,返回當前保存的數字,即是我們要找的數字。
代碼如下:
1 int MoreThanHalfNum(int* numbers, int length) 2 { 3 int result = numbers[0]; 4 int time = 1 ; 5 for (int i = 1 ;i < length ; i++) 6 { 7 if (0 == time) 8 { 9 result = numbers[i] ; 10 time++ ; 11 } 12 else if (numbers[i] == result) 13 { 14 time++; 15 } 16 else 17 { 18 time-- ; 19 } 20 } 21 return result ; 22 } 23 int main() 24 { 25 int numbers[] = {1,3,3,2,3,2,3,3,2}; 26 cout<<MoreThanHalfNum(numbers, 9); 27 getchar(); 28 return 0; 29 }