【劍指offer】面試題29:數組中出現次數超過一半的數字


題目:數組中一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為 9 的數組{1,2,3,2,2,2,5,4,2}。由於數字 2 在數組中出現了 5 次,超過數組長度的一半,因此輸出 2.

 這道題很多人都會想到對這個數組進行排序。那么在已排序的數組中,位於中間位置的數字就是超過數組長度一半的那個數。由於我們需要對數組進行排序,因此總時間復雜度為 O(n*lgN)。

  

解法二、利用數組特點找出 O(N) 的算法:

題目中要找的數字出現的次數超過數組長度的一半,也就是說它出現的次數比其他所有數字出現的次數的和還要多。

因此我們可以考慮在遍歷數組的時候保存兩個值:一個是數組中的一個數字,一個是次數。

當我們遍歷到下一個數字的時候,

如果下一個數字和當前我們保存的數字相同,則次數加 1;

如果和當前我們保存的數字不同,則次數減 1;

當次數減到 0 的時候,我們將保存的數字改為當前遍歷所處的位置,並將次數更改為 1。

 

完整的代碼如下:

 1 int MoreThanHalfNum(int *arr, int len)
 2 {
 3     int result = arr[0];
 4     int count = 1;
 5 
 6     for(int i = 1; i < len; ++i)
 7     {
 8         if(arr[i] == result)
 9             count ++;
10         else if(count == 0)
11         {
12             result = arr[i];
13             count = 1;
14         }
15         else
16             count --;
17     }
18     return result;
19 }
20 
21 int main(int argc, char *argv[])
22 {
23     int arr[5] = {1, 0, 1, 2, 1};
24 
25     int num = MoreThanHalfNum(arr, 5);
26     printf("The num is: %d\n", num);
27 
28     return 0;
29 }
View Code
時間復雜度:由於只遍歷一遍數組,因此時間復雜度為 O(n)。

 

 

本文完。


免責聲明!

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



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