剑指offer-包含min函数的栈

49 阅读2分钟

🌈剑指offer30.包含min函数的栈

题目:

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

写法一(暂时只有一)

准备

栈:先进后出

拟两个栈=>主栈 辅助栈

主栈:正常可放元素的栈; 辅助栈:专门用来放最小值的栈(min)

思路梳理

  1. 一开始,两个栈都是空的[],要压入新元素时,第一个元素无论是否比较都是辅助栈中的最小值(min),遂直接压入辅助栈第一个新元素;
  2. 第二次push(压入)开始,主栈每push(压入)一个新元素时,需要和辅助栈的栈顶(最后一个进去的)做对比,当新push(压入)元素小于辅助栈的栈顶(最后一个进入的元素)时,那说明在辅助栈当下所有的元素都比这个新元素大,那就将新push的元素也push(压入)到辅助栈中。此时,主栈中还是正常的元素,辅助栈栈顶还是最小值(min);
  3. 若主栈push的新元素大于辅助栈栈顶的元素时,本着同时进出,把辅助栈的最小值再次压入一个同样的最小值,不放新元素;
  4. 当开始pop时,本着同进出,主栈每pop(弹出)一个元素,辅助栈相应的也弹出一个元素;
  5. top() 可以直接找到主栈的栈顶(最后一个进来的元素);
  6. 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也是一种解答方法吗,还是各自理解的方式不太一样,我再继续研究看看



初次接触算法,如有不准确的地方欢迎指正,欢迎交流!!