タイトル
定義および実装得られたキューの最大キュー機能MAX_VALUEを、MAX_VALUE機能を必要とし、時間複雑さの一backのpop_frontはO(1)です。
キューが空の場合、pop_front MAX_VALUEと必要性-1
例1
输入:
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]
例2
输入:
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出: [null,-1,-1]
思考
- 朝に考えるように複雑最初の質問のビットが混乱は、実際には、「とスライディングウィンドウの最大のアプローチ」があり、一部は似ていますが、それは最大を記録するために、双方向のキューにあるよりも簡単。
- 2つのキュー、メインキューとしてのqと。補助キューとしてDQ。
- DQ最大の特徴は、背後にある、降順の要素の最初の要素です。
- 値を決定し、Qの値を入力するためのキューの新しい要素は、位置DQに置かなければならない場合、遭遇の端から比較開始DQキューが空であるか、またはAが見つかるまで以下キューにその要素よりも数、キューの末尾からその値よりも大きい値。
- キューの最初の要素は、最大値に注意を払うが変更される場合がありますが、DQ更新するので、DQ第一の方法は、その後、DQも出待ち行列の、要素は最初の要素に等しい値に等しいかどうかを判断するためにそれ以外の変更はありません。
コード
class MaxQueue {
private:
queue<int> qMain;
deque<int> dq;
public:
MaxQueue() {
}
int max_value() {
int res = -1;
if ( !qMain.empty() )
res = dq.front();
return res;
}
void push_back(int value) {
qMain.push( value );
while ( !dq.empty() && value > dq.back() )
dq.pop_back();
dq.push_back( value );
return;
}
int pop_front() {
int res = -1;
if (!qMain.empty() ) {
if ( qMain.front() == dq.front() )
dq.pop_front();
res = qMain.front();
qMain.pop();
}
return res;
}
};
/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue* obj = new MaxQueue();
* int param_1 = obj->max_value();
* obj->push_back(value);
* int param_3 = obj->pop_front();
*/