假設數組類型爲整形數組編程
首先想到的思路是對每一個出現過的數據進行個數統計,藉助一個鍵值對集合,存放不一樣的數據及對應的出現的次數。出現次數大於N/2的即爲要獲得的結果。當數據量大的時候,會消耗空間。數組
第二種思路是對已有的數據進行排序,排序以後相同的數據時連續的,又由於目標數據的出現次數大於N/2,因此下標在N/2的數據必定要找的數據。時間複雜度爲O(N*logN)code
前兩種思路要麼要藉助其餘空間,要麼時間複雜度高。下面介紹第三種思路。排序
若是咱們每次刪除兩個不一樣的數據,那麼該數在剩餘的數據中仍然佔大於N/2的比例,經過不斷的刪除,把大的問題簡化成小的問題,就能夠簡便的求解。get
int calculate(int a[],int n) { //target爲要找的數據 int target=0; int times=0; for(int i = 0;i<n;i++) { //若是times爲0,標誌着前面的數據已刪除,從剩下的數據中開始查找 if(times==0) { //將當前位置的數據假設爲target target=a[i]; times=1; } else { if(target==a[i]) { times++; } else { times--; } } } return target; }
參考書籍:《編程之美》class