59のインタビューの質問 - IIの最大キュー。
定義および実装得られたキューの最大キュー機能MAX_VALUEを、MAX_VALUE機能を必要とし、時間複雑さの一backのpop_frontはO(1)です。
キューが空の場合、pop_front MAX_VALUEと必要性-1
例1:
入力:
[ "MaxQueue"、 "一back"、 "一back"、 "MAX_VALUE"、 "pop_front"、 "MAX_VALUE"]
[]、[1]、[2]、[]、[]、[]]
出力: [NULL、NULL、NULL、2,1,2 ]
例2:
入力:
[ "MaxQueue"、 "pop_front"、 "MAX_VALUE"]
[[]、[]、[]]
出力:[NULL、-1、-1]
制限事項:
<= 10000の1 <合計オペレーティング=一back、pop_front、MAX_VALUE
1 <=値<= 10 ^ 5
思考
対象はほとんどが二つの配列、格納された値、ランク付けメモリサイズを維持することであると考えるようになったとき、私はこれを見ました。しかし、メンテナンスが非常に面倒ランキング配列で、各ポップ/プッシュは多くの要素を更新する必要があります。
ここでは公式の問題解決のアイデアを参照するだけでなく、double配列。
それは、以前の最大の値には影響しません、我々は唯一の最後の値を格納する必要があり、増加の配列を考えてみましょう。
減少の配列を考えてみて、それぞれの値が新しい最大値の後に、ある値を、ポップごと、保存する必要があります。
私の答え
type MaxQueue struct {
AscDeque []int
queue []int
}
func Constructor() MaxQueue {
return MaxQueue{
AscDeque: []int{},
queue: []int{},
}
}
func (this *MaxQueue) Max_value() int {
if len(this.AscDeque)==0{
return -1
}
return this.AscDeque[0]
}
func (this *MaxQueue) Push_back(value int) {
for len(this.AscDeque)>0&&this.AscDeque[len(this.AscDeque)-1]<value{
this.AscDeque=this.AscDeque[:len(this.AscDeque)-1]
}
this.AscDeque=append(this.AscDeque,value)
this.queue=append(this.queue,value)
}
func (this *MaxQueue) Pop_front() int {
if len(this.AscDeque)==0{
return -1
}
if this.queue[0]==this.AscDeque[0]{
this.AscDeque=this.AscDeque[1:]
}
tmp:=this.queue[0]
this.queue=this.queue[1:]
return tmp
}