劍指 Offer 59 II 佇列的最大值

2021-10-24 15:34:17 字數 995 閱讀 1763

請定義乙個佇列並實現函式 max_value 得到佇列裡的最大值,要求函式max_value、push_back 和 pop_front 的均攤時間複雜度都是o(1)。

若隊列為空,pop_front 和 max_value 需要返回 -1

本演算法基於問題的乙個重要性質:當乙個元素進入佇列的時候,它前面所有比它小的元素就不會再對答案產生影響。

上面的性質是非常關鍵的。舉個例子,如果我們向佇列中插入數字序列 1 1 1 1 2,那麼在第乙個數字 2 被插入後,數字 2 前面的所有數字 1 將不會對結果產生影響。因為按照佇列的取出順序,數字 2 只能在所有的數字 1 被取出之後才能被取出,因此如果數字 1 如果在佇列中,那麼數字 2 必然也在佇列中,使得數字 1 對結果沒有影響。

這樣的話,如果當前佇列中元素是1 1 1 2,那麼此時我們要從佇列中彈出1,那麼根據佇列先進先出的原則,1可以直接彈出,因為1不是最大值,不會對彈出後佇列的最大值造成影響,所以直接彈出就行了。如果要是彈出2,因為佇列最大值是2,那麼就要在單調陣列中把2刪除

class

maxqueue

// 返回單調佇列a中的第乙個元素就行了

public

intmax_value()

return a.

peekfirst()

;}// 佇列中加元素

public

void

push_back

(int value)

a.addlast

(value)

;//將value加入

}//佇列中彈出元素

public

intpop_front()

if(l.

get(head)

<

max_value()

)else

size--

;return l.

get(head++);

}}

劍指 Offer 59 II 佇列的最大值

題目描述 請定義乙個佇列並實現函式 max value 得到佇列裡的最大值,要求函式max value push back 和 pop front 的均攤時間複雜度都是o 1 若隊列為空,pop front 和 max value 需要返回 1 示例1 輸入 maxqueue push back p...

劍指Offer 59 II 佇列的最大值

請定義乙個佇列並實現函式 max value 得到佇列裡的最大值,要求函式max value push back 和 pop front 的均攤時間複雜度都是o 1 若隊列為空,pop front 和 max value 需要返回 1 額外維護乙個雙端佇列,用來儲存當前佇列可能的最大值,且是有序的,...

劍指 Offer 59 II 佇列的最大值

請定義乙個佇列並實現函式 max value 得到佇列裡的最大值,要求函式max value push back 和 pop front 的均攤時間複雜度都是o 1 若隊列為空,pop front 和 max value 需要返回 1 示例 1 輸入 maxqueue push back push ...