中央オファーは安全性データ・ストリームを証明します

1.トピック

データ・ストリームの中央値を取得する方法?数値が奇数データストリームから読み込まれた場合、中央値は、ソート後のすべての値の中央に位置しています。偶数値は、データストリームから読み出された場合、中央値は、注文の全ての中間値の後に2つの数の平均値です。私たちは、読み込まれ、現在の中央値のデータを取得するためにGetMedian()メソッドを使用して、データ・ストリームを読み取るために挿入()メソッドを使用します。

出典:安全オファー証明
リンク:https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1?tpId=13&tqId=11216&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

2.私の問題の解決

  • 大きな使ってヒープのトップleft小さな半分の数字の保存、ヒープが大きいトップright大きな半分の数字を保持します。
  • 挿入され挿入されるスタックのかを決定します。
  • 2つのヒープサイズ差以上でないことを確認してください1同じサイズでない場合は、それほど大きく最優先ヒープが大きく左;
class Solution {
    priority_queue<int,vector<int>,less<int> > left;//大顶堆
    priority_queue<int,vector<int>,greater<int> >right;//小顶堆
public:
    void Insert(int num)
    {
        if(left.empty() || num<left.top())left.push(num);
        else right.push(num);
        if(left.size()>right.size()+1){
            right.push(left.top());
            left.pop();
        }
        if(right.size()>left.size()){
            left.push(right.top());
            right.pop();
        }
    }

    double GetMedian()
    { 
        if(left.empty() && right.empty())return 0;
        if(left.size()==right.size()+1)return left.top();
        return 0.5 * (left.top()+right.top());
    }

};

3.誰か他の人の問題解決

4.まとめとリフレクション

(1)C++
priority_queue<int,vector< int >,less< int > >、デフォルトのヒープビッグトップ

priority_queue<int,vector< int >,greater< int > >の小さな山の頂上。

公開された70元の記事 ウォンの賞賛0 ビュー2122

おすすめ

転載: blog.csdn.net/weixin_43951240/article/details/104214409