方法一:
先對陣列進行排序
,再遍歷排序後的陣列,
統計每個數
的次數
,出現次數最大的數即為要找的數。
時間複雜度 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 乙個數字在陣列中的出現次數超過了一半...