對於絕對眾數(次數一定大於n/2), 可有最壞情況下o(n)的分治演算法。
(數字兩兩比較,如果兩個數不同,則兩個數都丟棄;如果兩個數相同,則丟棄其中乙個數。對剩下的數同樣處理,最後只剩乙個數為眾數)
而對與一般的眾數問題,可有兩種方法:
一、修改快排:
1、取軸值x, 根據快排的過程,小於x的放在左邊,大於x的放在右邊。同時統計x的出現次數t。
2、如果x左邊的個數(不算x)多於t,向左遞迴;同理,如果x右邊的個數對於t,向右遞迴。
時間複雜度:o(nlgn)
二、利用陣列統計。
如果已知原陣列的範圍為[0...m], 則可以直接利用陣列。
否則,需要用雜湊。
時間複雜度為o(n),但空間複雜度較高。
分治法求陣列中的眾數
先說一下題目吧,很簡單,就是給一組陣列,求陣列中的眾數,但是要用分治法。首先是要運用快排的分割演算法,設函式名為quick,重複次數設定為n,眾數設為mode,陣列長度即為length.c 實現的 如下 includeusing namespace std 全域性變數儲存重數 int n 0 全域性...
求陣列主元素的O n 演算法
在乙個規模為n的陣列a n 中,所謂主元素就是出現次數大於n 2的元素,例如 3.3.4.2.4.4.2.4.4 有乙個主元素為4。充分利用主元素的出現次數大於n 2這個已知條件,因為主元素的出現次數大於n 2,所以容易證明下面的解法是正確的 首先假設主元素是x,則遍歷陣列時出現與x相等的元素時,x...
求陣列中兩個不同的數
題目 在給定int陣列中存在著兩個不同的數字,而其他數字都存在另乙個數與它對應 相同 求出此陣列兩個不同的數字。解法 熟悉c 位操作的同學知道一種位操作 異或 能夠消除相同的資料,規則是 1 1 0 1 0 1 0 1 1 0 0 1 顯而易見,位上相同異或會置0,位上不相同會置1,所以相同的數字在...