給定含有n個元素的多重集合s,每個元素在s**現的次數稱為該元素的重數,多重集s中重數最大的元素稱為眾數,給定多重集合s,求s中的眾數集重數。
首先,我們最容易想到的就是統計每個數的出現次數,然後比較得出結果。這個思路可以利用容器來實現。
仔細思考,這道題目還可以用分治法來解決。
解決步驟:
①給陣列排序;
②找出中位數v並且確定中位數的個數num和左右邊界;
③如果左邊界左邊數字的個數比num大,說明眾數可能在左邊,重複②之後的步驟;
④如果右邊界右邊數字的個數比num大,說明眾數可能在右邊,重複②之後的步驟;
⑤得出眾數v和重數num。
public class solution
arrays.sort(a, 0, n);
for(int i = 0; i < n; i++)
solve(0, n - 1);
system.out.println("value:" + v);
system.out.println("number:" + num);
}public static void solve(int l, int r)
if (i - l + 1 > num)
if (r - j + 1 > num)
}}
分治演算法解決眾數問題
題目 給定含有n個元素的多重集合s,每個元素在s 現的次數稱為該元素的重數。多重集s中重數最大的元素稱為眾數,如s 多重集s的眾數是2,其重數為3。分析 include using namespace std define m 100 int a m int num,val,n 重數,眾數,個數 v...
c語言分治法求眾數重數 分治法之眾數問題
實驗總結 剛開始我沒有想到可以用分治法來做,用的是陣列來做。做完以後發現演算法太過複雜,而且處理較大的n時,時間複雜度和空間複雜度都比較大。於是我參考了演算法答案那本書,學到了分治法來解決這道題。但是在完成了用分治法的 以後,我發現了問題 輸出應該為 分治法解決這道題有乙個大前提 多重集中的元素是有...
眾數問題(遞迴 分治)
所謂眾數,就是對於給定的含有n個元素的多重集合,每個元素在s中出現次數最多的成為該元素的重數,多重集合s重的重數最大的元素成為眾數。例如 s 則多重集s的眾數是2,其重數為3。現在你的任務是 對於給定的由m個自然數組成的多重集s,計算出s的眾數及其重數。解題思路 1 快速排序 2 求中位數 3 計算...