面試題25 陣列中出現次數超過一半的數字

2021-06-17 01:27:32 字數 1291 閱讀 8669

方法一:

先對陣列進行排序

,再遍歷排序後的陣列,

統計每個數

的次數

,出現次數最大的數即為要找的數。

時間複雜度  o(nlogn) + o(n) = o(nlogn)

不需要額外儲存空間

方法二:

先對陣列進行排序

,出現次數超過陣列長度的一半的數必然是

陣列中間的那個數

時間複雜度o(nlgn)+ o(1)= o(nlgn)

不需要額外儲存空間

方法三:不排序

,掃瞄一遍陣列,

每次刪除兩個不同的數,最終得到那個數即為要找的數

時間複雜度o(

n)空間複雜度o(1) 

**:

#include "stdafx.h"

#include using namespace std;

//找出陣列中出現次數超過一半的數字,找到則返回true,否則返回fasle

bool findhalfcountnum(int narr, int nlength, int &nnum)

int ncandidate = narr[0];

int ncount = 1;

for (int i=1; inlength)

else }

int _tmain(int argc, _tchar* argv)

; if (findhalfcountnum(narr1, 9, nnum))

int narr2[9] = ;

if (findhalfcountnum(narr2, 9, nnum))

int narr3[1] = ;

if (findhalfcountnum(narr3, 1, nnum))

system("pause");

return 0;

}

執行結果:

面試題29 陣列中出現次數超過一半的數字

題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5詞,超過陣列長度的一半,因此輸出2.思路 1,如果對陣列排序,那麼n 2對應的數一定是超過一半的數字 前提是存在這個數字 即長度為n的陣列中第n 2大的數字,o n 2,根據陣列...

面試題29 陣列中出現次數超過一半的數字

面試題29 陣列中出現次數超過一半的數字 題目 陣列中有乙個數字的出現次數超過了陣列長度的一半,找出這個數字。常規的演算法是先對陣列排序,排序的時間複雜度是o nlogn 如果和之前儲存的數字相同,次數加1 不同則次數減1.次數為0,則儲存下乙個數字並把次數設為1.我們要找 的數字就是最後一次把次數...

面試題02 陣列中出現次數超過一半的數字

題目 陣列中有乙個數字出現的次數超過了陣列長度的一半,找出這個數字。分析 1,如果無序,是不是可以先把陣列中所有這些數字進行排序,最常用的快速排序o n logn 即可。然後把那個出現次數超過一半的數字直接輸出,題目便解答完成了。總的時間複雜度為o n logn 乙個數字在陣列中的出現次數超過了一半...