首先 ,不妨假設mid為最初的中位數,開乙個小根堆儲存 q1(<=mid)乙個大根堆儲存 q2( >mid)當向堆中加入元素通過與mid比較
1 scanf("當兩堆中元素個數不等的時候 就要維護mid肯定是多的元素堆移向少的元素堆%d",&a[i]);
2if(a[i]>mid) q2.push(a[i]);
3else q1.push(a[i]);
1一道簡單例題::if(q1.size()>q2.size())6}
7else
if(q1.size()
12 }
1 #include2view code#define ull unsigned long long
3#define ll long long
4const
int mod=1e9+7;5
const
int maxn=1e5+5;6
using
namespace
std;78
inta[maxn];
9 priority_queue,less >q1;
10 priority_queue,greater >q2;
1112
intmain()
1320
int mid=a[1
];21 printf("
%d\n
",mid);
22for(int i=3;i<=n;i+=2)23
27else
30if(a[i]>mid)
33else
36if(q1.size()>q2.size())41}
42else
if(q1.size()
48 printf("
%d\n
",mid);49}
50return0;
51 }
中位數 (優先佇列)
這種題型比較常見,所以總結下來為妙。一般暴力的方法是找到排乙個序,然後輸出中間點。然後正解的方法是優先佇列。乙個大根堆乙個小根堆,用於儲存中位數左邊的數和中位數右邊的數。然後每一次插入某個數的時候,可以插入到中間,然後判斷左右兩個堆的大小,保持均等即可。include include include...
動態求中位數 堆 優先佇列
堆是一種類似二叉樹的結構,分為小根堆和大根堆,小根堆是父節點的值比子節點小,大根堆是父節點的值比子節點大。堆是用陣列來實現的,0為根節點,每個結點的子節點下標為2 i 1和2 i 2 如果要保證堆的結構,需要 上浮 shift up 下沉 shift down 來維護,時間複雜度為log 有這樣一道...
資料流的中位數(優先佇列解決)
中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 示例 addnum 1 addnum 2 findmedian 1.5 addnum 3 findmedian 2...