數組中出現次數超過一半的數字


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

例如輸入數組:{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 }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM