1. 程式人生 > >眾數問題(遞迴、分治)

眾數問題(遞迴、分治)

所謂眾數,就是對於給定的含有N個元素的多重集合,每個元素在S中出現次數最多的成為該元素的重數,

多重集合S重的重數最大的元素成為眾數。例如:S={1,2,2,2,3,5},則多重集S的眾數是2,其重數為3。

現在你的任務是:對於給定的由m個自然陣列成的多重集S,計算出S的眾數及其重數。

解題思路:

(1)快速排序

(2)求中位數

(3)計算出中位數的最左端和最右端的位置,然後分割成2段陣列

(4)中位數個數與左端個數比較,中<左 即最大眾數可能存在左端,將左端再進行2段分割(遞迴)直到 中 > 左為止。 右端同理。。。

#include<bits/stdc++.h>
using namespace std; const int maxn = 1e2+5; int num , val,n; int a[maxn]; void find(int &l,int &r,int id) { l = id,r = id; while(a[l] == a[id] && l >= 1) --l; l++; while(a[r] == a[id] && r <= n) ++r; r--; return ; } void solve(int l,int r) { if
(l > r) return ; int mid = l + r >> 1; int i,j; find(i,j,mid); if(j - i + 1 > num) { num = j - i + 1; val = a[mid]; } if(i - l > num) solve(l,i-1); if(r - j > num) solve(j+1,r); return ; } int main() { srand(0); //freopen
("input.txt","r",stdin); //freopen("output.txt","w",stdout); while(cin >> n) { /*for(int i = 1;i <= n;++i) cin >> a[i];*/ for(int i = 1;i <= n;++i) a[i] = rand() % 10; sort(a+1,a+n+1); for(int i = 1;i <= n;++i) printf("%d%c",a[i],i == n ? '\n' : ' '); num = val = 0; solve(1,n); printf("%d %d\n",val,num); } return 0; }