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


【題 目】數組中有一個數字的出現次數超過了該數組長度的一半,找出這個數字。

  【思 路1】由於要尋找的數字的出現次數超過了數組長度的一半,所以如果將該數組排序,那么它的中位數必然是我們要尋找的數字,所以我們的任務就是對該數組進行排序,而性能最好的快速排序的時間復雜度為O(nlogn),我們可以直接借助庫函數完成,由於其效率不是很高,所以這里就不再贅述。   【思 路2】對於一個數組中的元素的次數的統計,最快的查找方法是什么?當然哈希表了!我們能不能建立哈希表呢,稍微思考,我們就可以發現,哈希表只適用於元素的范圍比較小的情況,而假設我們的數組是一個整型數組,取值范圍跨度太大,所以不適合用哈希表,太浪費空間了。   等一下,用哈希表的話,我們似乎不需要的條件是:該數字出現次數超過了數組長度的一半?那么多了這個條件,我們能想到什么?這個數字的次數超過了其他所有數字出現的次數之和,所以我們如果用一個key值記錄數組中的數字,然后用一個value記錄該數字出現的次數,然后累加:繼續遍歷余下的所有數字,如果和這個數字相等,就把次數加1;如果和這個數字不等,那么就把該數字的次數減1;如果某數字的出現次數為0,那么我們就用下一個數字替換之,然后重置出現次數為1。這樣最后剩下的數字肯定就是出現次數超過數組長度一半的數字。好了,討論到這里我們可以很容易的寫出如下的代碼: 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 //全局變量,檢查輸入是否有效
 6 bool invalidInput = false;
 7 
 8 /************************************************************
 9 /* 找出數組中出現次數超過數組長度一半的數字
10 /************************************************************/
11 int NumberAppearMoreThanHalf(int* numbers,unsigned int length)
12 {
13     if(numbers == NULL || length <= 0)
14     {
15         invalidInput = true;
16         return 0;
17     }
18 
19     invalidInput = false;
20     int key = numbers[0];
21     unsigned int appearTimes = 1;
22     for(int i = 1;i < length;++i)
23     {
24         if(appearTimes == 0)
25         {
26             key = numbers[i];
27             appearTimes = 1;
28         }
29 
30         if(numbers[i] == key)
31             appearTimes++;
32         else
33             appearTimes--;
34     }
35     
36     //檢驗輸入的數組是含有滿足條件的數字
37     appearTimes = 0;
38     for(i = 0; i < length; i++)
39     {
40         if(numbers[i] == key)
41             appearTimes++;
42     }
43 
44     if(appearTimes <= length / 2)
45     {
46         invalidInput = true;
47         return 0;
48     }
49     
50     return key;
51 }
52 
53 int main()
54 {
55     cout<<"Enter the length of your array:"<<endl;
56     int arraylength = 0;
57     cin>>arraylength;
58 
59     cout<<"Enter the elements of your array:"<<endl;
60     int *array = new int[arraylength];
61     for(int k = 0; k < arraylength;k++)
62     {
63         cin>>array[k];
64     }
65 
66     cout<<"the number appear more than half length of your array is:"<<endl;
67     cout<<NumberAppearMoreThanHalf(array,arraylength)<<endl;
68     
69     delete[] array;
70     
71     return 0;
72 }
轉載自:http://www.cnblogs.com/python27/archive/2011/12/15/2289534.html

 


免責聲明!

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



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