這種題型比較常見,所以總結下來為妙。
一般暴力的方法是找到排乙個序,然後輸出中間點。
然後正解的方法是優先佇列。
乙個大根堆乙個小根堆,用於儲存中位數左邊的數和中位數右邊的數。
然後每一次插入某個數的時候,可以插入到中間,然後判斷左右兩個堆的大小,保持均等即可。
#include #include #include #include #include #include #include using namespace std;
void read(int &x)
while(s>='0'&&s<='9')
x*=f;
}int n,m;
int a[200000];
string mid="mid";
string add="add";
priority_queue,less>b;
priority_queue,greater>s;
int main()
while(ts-tb>=2)
} if(s==mid)
} return 0;
}
3871 中位數 中位數( 優先佇列較優處理 )
首先 不妨假設mid為最初的中位數,開乙個小根堆儲存 q1 mid 乙個大根堆儲存 q2 mid 當向堆中加入元素通過與mid比較 1 scanf d a i 2if a i mid q2.push a i 3else q1.push a i 當兩堆中元素個數不等的時候 就要維護mid肯定是多的元素...
動態求中位數 堆 優先佇列
堆是一種類似二叉樹的結構,分為小根堆和大根堆,小根堆是父節點的值比子節點小,大根堆是父節點的值比子節點大。堆是用陣列來實現的,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...