【劍指offer】題64:數據流中的中位數

STL適配器:

heap、priority_queue 默認是 vector 實現的最大堆

stack,queue默認是 dequeue 實現的

注意top,pop時,需判斷空的情況!


試用一個最大堆和一個最小堆,保持兩個最大堆中所有數小於最小堆,且保證兩個堆元素個數相差不超過1。


#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <queue>
#include <functional>
using namespace std;

//stl中,棧默認使用雙端隊列實現,堆和優先隊列默認使用vector實現
priority_queue<int, vector<int>, less<int>> min_que;
priority_queue<int, vector<int>, greater<int>> max_que;

void Insert(int num)
{
    if (min_que.size() < max_que.size())
    {
        min_que.push(num);
    }
    else
    {
        max_que.push(num);
    }
    if ((!min_que.empty() && !max_que.empty()) && min_que.top() > max_que.top())//注意判斷是否爲空
    {
        int tmp1 = min_que.top();
        int tmp2 = max_que.top();
        min_que.pop();
        max_que.pop();
        min_que.push(tmp2);
        max_que.push(tmp1);
    }
}

double GetMedian()
{
    //注意判斷爲空的情況
    if (min_que.empty()&&max_que.empty())
    {
        return -1;
    }
    if (min_que.empty())
    {
        return max_que.top();
    }
    else if (max_que.empty())
    {
        return min_que.top();
    }

    if (min_que.size() == max_que.size())
    {
        return ((double)(min_que.top() + max_que.top()) / 2);
    }
    else if (min_que.size() < max_que.size())
    {
        return max_que.top();
    }
    else
    {
        return min_que.top();
    }
}

int main()
{
    cout<<GetMedian()<<endl;
    for (auto i = 0; i < 100; i++)
    {
        Insert(i);
        cout << GetMedian() << endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章