陣列中出現次數超過一半的數字

2021-08-08 20:29:52 字數 1838 閱讀 3382

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

思路一:陣列排序後,如果符合條件的數存在,則一定是陣列中間那個數。(比如:1,2,2,2,3;或2,2,2,3,4;或2,3,4,4,4等等)

這種方法雖然容易理解,但由於涉及到快排sort,其時間複雜度為o(nlogn)並非最優;

class solution 

};

思路二:如果有符合條件的數字,則它出現的次數比其他所有數字出現的次數和還要多。

在遍歷陣列時儲存兩個值:一是陣列中乙個數字,一是次數。遍歷下乙個數字時,若它與之前儲存的數字相同,則次數加1,否則次數減1;若次數為0,則儲存下乙個數字,並將次數置為1。遍歷結束後,所儲存的數字即為所求。然後再判斷它是否符合條件即可。

class solution 

};

如果這個題目是排好序的陣列,那麼我們就很容易統計出每個數字出現的次數。題目給出的陣列沒有說是排好序的,因此我們需要先給它排序。排序的時間複雜度是o(nlogn)。最直觀的演算法通常不是面試官滿意的演算法,我們需要找出更快的演算法。

****其中一種思路是:基於partition函式的o(n)演算法

我們回到題目本身分析,就會發現前面的思路並沒有考慮到

陣列的特性

:陣列中有乙個數字出現的次數超過了陣列長度的一半。如果我把這個陣列排序,那麼排序之後位於陣列中間的數字一定就是那個出現次數超過陣列一半的數字。也就是說,這個數字就是統計學上的中位數,即長度為n的陣列中第n/2的數字。我們有成熟的o(n)的演算法得到陣列中任意第k大的數字

這種演算法是受快速排序演算法的啟發。在隨機快速排序演算法中,我們現在陣列中隨機選擇乙個數字,然後調整陣列中數字的順序,使得比選中的數字小的數字都排在它的左邊,比選中的數字大的數字都排在它的右邊。如果這個選中的數字的下標剛好是n/2,那麼這個數字就是陣列的中位數。如果它的下標大於n/2,那麼中位數應該位於它的左邊,我們可以接著在它的左邊部分的陣列中查詢。如果它的下標小於n/2,那麼中位數應該位於它的右邊,我們可以接著在它的右邊部分的陣列中查詢。這是乙個典型的遞迴過程,實現**如下:

class solution

else

}int result=numbers[middle];           //這裡的只是得到了第middle=n/2大的數字,但總個體是否超過一段還需要判斷

if(!checkmorethanhalf(numbers,length,result))    //此時需要檢查result的值的個數是否大於整個陣列的一半

return 0;

return result;

}int partition(vectorinput,int low,int high)

return low;

}/*這個partition是優化了不必要的交換,將swap用賦值替換

int partition(vector&input, int begin, int end)

input[low] = pivot;

return low;}*/

bool checkmorethanhalf(vectornumbers,int length,int result)    //檢查result的值的個數是否大於整個陣列的一半

{int times=0;

for(int i=0;i

陣列中出現次數超過一半的數字

何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。輸入 每個測試案例包括2行 第一行輸入乙個整數n 1 n 100000 表...

陣列中出現次數超過一半的數字

陣列中出現次數超過一半的數字 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。class solution count 0 for auto i numbers if i k ...

陣列中出現次數超過一半的數字

題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。解題思路 將陣列按大小排序,若存在數字出現次數超過陣列長度的一般,則陣列中位數必定為該數字 1 將陣列排序完成後,取a...