劍指 59 II 佇列中的最大值 難度中等

2021-10-21 00:13:23 字數 1461 閱讀 5219

請定義乙個佇列並實現函式 max_value 得到佇列裡的最大值,要求函式max_value、push_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]

限制:1 <= push_back,pop_front,max_value的總算子 <= 10000

1 <= value <= 10^5

分析:佇列的出隊和入隊借助陣列的方法可以達到o(1)時間的要求,求當前佇列中的最大值,一種直觀的想法是,每次遍歷一遍佇列找出最大值,這樣在時間上需要o(n),不符合題目要求。

求佇列最大值的第二種想法,用乙個變數max記錄佇列中的最大值,但如果此時出隊恰巧是max中記錄的值,我們就不知道下乙個最大值應該是誰了。

正確解法:額外開闢乙個佇列記為queue2,它是遞減的,用於記錄queue1順序下的最大值、次大值…… , 每次找queue1的最大值時,取queue2的隊首即可。

var maxqueue = function() ;

/** * @return

*/maxqueue.prototype.max_value = function()

return -1;

};/**

* @param value

* @return

*/maxqueue.prototype.push_back = function(value)

this.queue2.push(value);

};/**

* @return

*/maxqueue.prototype.pop_front = function()

const value = this.queue1.shift();

//同時維護queue2

if(value === this.queue2[0])

return value;

};/**

* your maxqueue object will be instantiated and called as such:

* var obj = new maxqueue()

* var param_1 = obj.max_value()

* obj.push_back(value)

* var param_3 = obj.pop_front()

*/

面試題59 II 佇列的最大值

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

面試題59 II 佇列的最大值

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

劍指 Offer 59 II 佇列的最大值

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