🌈剑指offer30.包含min函数的栈
题目:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
写法一(暂时只有一)
准备
栈:先进后出
拟两个栈=>主栈 辅助栈
主栈:正常可放元素的栈; 辅助栈:专门用来放最小值的栈(min)
思路梳理
- 一开始,两个栈都是空的[],要压入新元素时,第一个元素无论是否比较都是辅助栈中的最小值(min),遂直接压入辅助栈第一个新元素;
- 第二次push(压入)开始,主栈每push(压入)一个新元素时,需要和辅助栈的栈顶(最后一个进去的)做对比,当新push(压入)元素小于辅助栈的栈顶(最后一个进入的元素)时,那说明在辅助栈当下所有的元素都比这个新元素大,那就将新push的元素也push(压入)到辅助栈中。此时,主栈中还是正常的元素,辅助栈栈顶还是最小值(min);
- 若主栈push的新元素大于辅助栈栈顶的元素时,本着同时进出,把辅助栈的最小值再次压入一个同样的最小值,不放新元素;
- 当开始pop时,本着同进出,主栈每pop(弹出)一个元素,辅助栈相应的也弹出一个元素;
- top() 可以直接找到主栈的栈顶(最后一个进来的元素);
- min() 可以直接找到辅助栈的栈顶(最后一个进来的元素);
代码实现
/**
* initialize your data structure here.
*/
var MinStack = function() {
//准备,一个主栈和一个辅助栈
this.norStack=[];
this.min_stack=[]
};
/**
* @param {number} x
* @return {void}
*/
MinStack.prototype.push = function(x) {
//压入新元素时,主栈正常压入
this.norStack.push(x);
//同时,辅助栈压入新元素时,需要与主栈新压入的元素做对比
if(!this.min_stack.length) {//辅助栈为空
this.min_stack.push(x)
}else {
if(x <=this.min_stack[this.min_stack.length-1]){//新元素小于辅助栈栈顶元素
this.min_stack.push(x)
}else {
this.min_stack.push(this.min_stack[this.min_stack.length-1])//大于的话,就压入辅助栈原本自己的min值
}
}
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
this.min_stack.pop()
this.norStack.pop();
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
return this.norStack[this.norStack.length-1]//直接看主栈的正常放入的栈顶
};
/**
* @return {number}
*/
MinStack.prototype.min = function() {
return this.min_stack[this.min_stack.length-1]//直接看辅助栈的栈顶
};
/**
* Your MinStack object will be instantiated and called as such:
* var obj = new MinStack()
* obj.push(x)
* obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.min()
*/
有个小问题
翻看了很多解答,关于pop部分,有两个方向:
1:pop时,主栈与辅助栈同进同出;【这个是我用的】
2:pop时,主栈与辅助栈比较后,主栈出,辅助栈大于主栈则辅助栈不出,单主栈出
方向2也是一种解答方法吗,还是各自理解的方式不太一样,我再继续研究看看
初次接触算法,如有不准确的地方欢迎指正,欢迎交流!!