求陣列中頻次超過一半的元素

2021-07-06 01:06:31 字數 1127 閱讀 3605

快排裡面的partition,遞迴找到中間元素,使得左邊元素小於或等於中間元素,右邊元素大於或等於中間元素。時間複雜度為o(n),空間複雜度為o(n),原來元素的順序被打亂了。

hashmap,將陣列元素建立hashmap,key為陣列元素的值,value為元素出現頻次,找到頻次出現超過半數的key,複雜度和上述一樣

上面兩種方法計算複雜度為o(n),但空間複雜度為o(n),不是最優解,下面的方法空間複雜度為o(1):

用兩個臨時變數,乙個儲存陣列元素,乙個記錄出現頻次。

遍歷陣列,如果當前元素和臨時元素相等,頻次加一;

否則減一,如果頻次小於1,則臨時元素變為當前元素,出現頻次變為1。

分析:如果乙個數出現頻次大於半數,那麼它出現的頻次必然大於其他所有元素出現的頻次,一次遍歷後,臨時元素儲存的肯定是頻次超過一半的元素。

**如下:

//

// main.cpp

// morethanhalf

//// created by lilingyu on 15/10/20.

//#include /*

已知有陣列裡面有個元素出現次數超過一半,問如何找出這個數,時間複雜度o(n),空間複雜度o(1)

常見的hashmap時間複雜度為o(n),空間複雜度為o(n),不是最優選

*/bool ismorethanhalf(int* a, int

len, int number)}}

return

false;

}int morethanhalf(int* a, int

len)

else}}

/*if (counter>=0)

else*/

if (ismorethanhalf(a, len, tmp))

else

}int main(int argc, const char * argv) ;

for (int i=0; iprintf("\n");

printf("result: \n");

printf("%d\n", morethanhalf(a, len));

return

0;}

求陣列中出現次數超過一半的元素

如果可以排序,就先排序,找n 2位置的元素,如果有,那麼這個元素就是,但也有可能沒有,所以要再檢查一遍,該方法的時間複雜度為o nlogn 另外一種方法就是用乙個棧來實現,對於當前元素,若棧空,則入棧,若棧不為空,與棧頂元素比較,相等則入棧,不等則彈出棧頂元素。如果有主元素,最後的棧頂一定是主元素。...

獲取陣列中出現次數超過一半的元素

根據陣列特點找出o n 的演算法 1.陣列中有乙個數字出現的次數超過陣列長度的一半,也就是說它出現的次數比其他所有的數字出現的次數的和還要多。2.因此我們可以考慮在遍歷陣列的時候儲存兩個值 乙個是陣列中的乙個數字,乙個是次數。3.當我們遍歷到下乙個數字的時候,如果下乙個數字和我們之前儲存的數字相同,...

陣列中超過一半的數字

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。思路 定義乙個變數儲存當前元素,乙個計數器儲存次數,若次數等於0,則重新取字元。若次數大於零,遇到相同字元計數器 1,不同字元計...