左神演算法初級班3中運用堆結構求解的那個問題 題解

2021-08-19 10:07:07 字數 1259 閱讀 1018

有乙個容器,一次吐出數字,讓你求給定任意時刻所吐出來的數的中位數

分別建立乙個大根堆和乙個小根堆,用來維護排序後的陣列小於中間數字的數(放入大根堆中)和大於中間數字的數(放入小根堆中),當大根堆和小根堆中資料個數相差大於1時,就讓資料多的那個堆中的數跑到資料少中的那個堆中去,這樣能夠保證兩個堆的堆頂的數始終是排序後陣列最中間的兩個數。為啥2個堆頂的數能夠是排序後陣列最中間的兩個數呢。這是因為大根堆和小根堆的性質決定的。大根堆(堆中堆頂的數是整個堆中最大的數),小根堆(堆中堆頂的數是整個堆中最小的數)。如果把大根堆放在前面,小根堆放在後面,這兩個堆拼接起來,正好能夠從中間分出一道界限,左邊的是大根堆裡的數,都小於中間的兩個數中左邊的數,右邊是小跟堆裡的數,都大於中間兩個數中右邊的數。整體是有序的,但是區域性還是不有序,但是沒有關係,我們要的只是分界點的那兩個數字。

#includeusing namespace std;

int a;//每次流出的數

int maxheap[9999999];//大根堆陣列

int minheap[9999999];//小根堆陣列

int maxheapsize=0;//大根堆當前狀態的大小

int minheapsize=0;//小根堆當前狀態的大小

int n;//表示哪個時刻求中位數,相當於陣列的大小

void maxswap(int i,int j)//交換大根堆陣列中i,j位置上的數

void minswap(int i,int j)//交換小根堆陣列中i,j位置上的數

void maxheapinsert(int i)//加大根堆操作

}void minheapinsert(int i)//加小根堆操作

}void minheapfy(int i,int minheapsize)//小根堆數變大後再次調成小根堆,i代表哪個位置上的數變化了,maxheapsize代表小根堆陣列的大小

if(a<=maxheap[0])//當流出的數a小於大根堆堆頂的數的時候,數a進入大根堆

else//當流出的數a大於大根堆堆頂的數的時候,數a進入小根堆

if(maxheapsize-minheapsize>1)//當大根堆和小根堆中的數相差大於1個的時候,哪個堆的數多就把哪個堆的堆頂的數放入到數少的堆中。這裡是大根堆中的數多,具體咋換,看下面

if(minheapsize-maxheapsize>1)

}double jieguo=((minheap[0]+maxheap[0])*1.0)/2;

cout<}

}

左神演算法初級班筆記6 字首樹 貪心

arr2中有哪些字元,是作為arr1中某個字串字首出現的?請 列印 arr2中有哪些字元,是作為arr1中某個字串字首出現的?請列印 arr2 現次數最大的字首。不要企圖證明貪心的正確性,想幾個貪心策略之後,用對數器去證明正確的即可。1.按最低字典序拼接字串給定乙個字串型別的陣列strs,找到一種拼...

左神初級班 (二)

實現一種狗貓佇列的結構,要求如下 使用者可以呼叫add方法將cat類或dog類的例項放入佇列中 使用者可以呼叫pollall方法,將佇列中所有的例項按照進佇列的先後順序依次彈出 使用者可以呼叫polldog方法,將佇列中dog類的例項按照進佇列的先後順序依次彈出 使用者可以呼叫pollcat方法,將...

左神演算法課初級班P1 簡單排序

插入排序 選擇排序 對數器異或運算 二分法的詳解與拓展 遞迴行為與master公式 執行程式中乙個跟樣本量無關的操作為常數操作,分析時間複雜度就是分析常數操作的個數,然後拋棄掉低階項。評價演算法先參考時間複雜度然後空間複雜度,最後分析在不同樣本量下程式執行的速度。給乙個數字序列,5,3,4,2,1 ...