题目链接:包含min函数的栈
题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
分析:
本题的关键难点在于用O(1)的时间复杂度寻找最小值。既然是O(1)的时间复杂度,那就不能遍历,只能拿空间换时间。这个空间应该也是一个数组。
用一个主栈,一个辅助栈,辅助栈栈顶为当前主栈中的最小元素。
当push(x)时,如果辅助栈为空,或者辅助栈的栈顶元素>=x,那么x入辅助栈。这样能够保证辅助栈是非递增的。相等时也入栈是因为,假如有多个最小元素-2,那么一个-2出栈了,还有-2在辅助栈,当前最小还是-2。否则只入栈一个-2的话,出栈一个,就会导致最小元素出现错误。
当pop(x)时,如果主栈栈顶元素和辅助栈栈顶元素相等,那么辅助栈栈顶元素也出栈,表示当前最小元素被出栈了,需要更新最小元素。
min函数直接返回辅助栈栈顶元素即可,就是O(1)。
代码如下:
/**
* initialize your data structure here.
*/
var MinStack = function() {
this.stack1=[];
// 辅助栈,维护当前最小的元素
this.stack2=[];
};
/**
* @param {number} x
* @return {void}
*/
MinStack.prototype.push = function(x) {
this.stack1.push(x);
// 当前栈顶元素>=x的时候入栈,如果有多个最小元素-2,那应该都入栈,这样出栈一个-2.还有-2
if(this.stack2.length==0|| this.stack2[this.stack2.length-1]>=x)
this.stack2.push(x);
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
// 只有当前辅助栈栈顶元素等于主栈栈顶元素的时候才出栈,表示当前的最小元素被出栈了,
if(this.stack2[this.stack2.length-1]===this.stack1[this.stack1.length-1])
this.stack2.pop();
this.stack2.pop();
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
return this.stack1[this.stack1.length-1];
};
/**
* @return {number}
*/
MinStack.prototype.min = function() {
return this.stack2[this.stack2.length-1];
};