队列的最大值(js数组模拟实现队列)

    科技2022-08-17  111

    请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1。 模板:

    var MaxQueue = function() { }; /** * @return {number} */ MaxQueue.prototype.max_value = function() { }; /** * @param {number} value * @return {void} */ MaxQueue.prototype.push_back = function(value) { }; /** * @return {number} */ MaxQueue.prototype.pop_front = function() { }; /** * 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() */

    解题思路:

    在一个数据队的基础上,维护一个单调递减的辅助队,辅助队的队首即为数据队的最大值

    当一个元素进入数据队时,该元素前面所有比它小的元素就不会对最大值产生影响,因为队列的先进先出原则让 在最大值前面 且 比最大值小 的元素在被pop出队之前都不会作为最大值被输出

    故当一个元素进入数据队时,循环判断 若辅助队不为空 且 该元素大于辅助队队尾的元素(保证辅助队队首的元素为数据队的最大值),则删除辅助队队尾元素(最大值之前的元素都不会对结果产生影响),直到辅助队为空 或 该元素小于辅助队队尾元素(辅助队单调递减),再让该元素入辅助队,这样就维持了一个单调递减的辅助栈

    函数设计:

    push_back(value)函数: 1.让value进入数据队 2.循环判断 若辅助队不为空且value大于辅助队队尾的元素(会影响到最大值),则删除辅助队队尾元素(该元素不再是最大值且位于最大值之前 不会影响最大值),直到辅助队为空或该元素小于辅助队队尾元素(单调递减),再让该元素进入辅助队max_value()函数: 1.若辅助队为空,则返回-1 2.若辅助队不为空,则返回辅助队队首元素pop_front()函数: 1.若数据队为空,则返回-1 2.若数据队不为空,表示有值可以输出,则需判断要被输出的元素是否会影响到最大值,只需判断该元素是否等于辅助队的队首元素,如果不等于说明该元素不是最大值,且位于最大值之前 不会对最大值产生影响

    代码实现:

    var MaxQueue = function() { this.stack1 = [];//数据队 this.stack2 = [];//递减队 }; /** * @return {number} */ MaxQueue.prototype.max_value = function() { if(this.stack2.length == 0){//判断辅助队是否为空 return -1; } return this.stack2[0];//返回辅助队队首元素 即最大值 }; /** * @param {number} value * @return {void} */ MaxQueue.prototype.push_back = function(value) {//先进 this.stack1.push(value);//进数据队 while(this.stack2.length && this.stack2[this.stack2.length - 1] < value){//若辅助队不为空 且 value大于辅助队队尾的元素 this.stack2.pop();//删除辅助队队首元素 即更新最大值 } this.stack2.push(value); }; /** * @return {number} */ MaxQueue.prototype.pop_front = function() {//先出 if(this.stack1.length == 0){//数据队为空 return -1; } let value = this.stack1.shift();//剪切数据队队首元素 if(value == this.stack2[0]){//删除的元素为最大值 会影响最大值结果 this.stack2.shift();//剪切辅助队队首元素 } 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() */
    Processed: 0.011, SQL: 9