带最小值操作的栈 · Min Stack

[抄题]:

实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。

你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。

[思维问题]:

想不到,脑洞不够大

[一句话思路]:

用一个minstack来辅助实现

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 主函数中,数据结构为类+名 类是Stack<Integer>
  2. minStack.empty() == true 或者isempty都可以
  3. pop分为两种情况:二者peek(不是peak)相等的、不相等的; 方法加点来用

[二刷]:

  1. push可能有空的情况,要注意

[总结]:top只是看一看,peek也只是看一看。所以top里面包含peek

[复杂度]:Time complexity: O(1) Space complexity: O(n)

[英文数据结构,为什么不用别的数据结构]:

[其他解法]:

[Follow Up]:

[题目变变变]:

public class MinStack {
        private Stack<Integer> stack;
        private Stack<Integer> minStack;
    
    public MinStack() {
        // do intialization if necessary
        stack = new Stack<Integer>();
        minStack = new Stack<Integer>();
    }

    /*
     * @param number: An integer
     * @return: nothing
     */
    public void push(int number) {
        // write your code here
        stack.push(number);
        if (minStack.isEmpty()) {
            minStack.push(number);
        }
        else {
            if (number <= minStack.peek()) {
            minStack.push(number);
        }
        }
    }

    /*
     * @return: An integer
     */
    public int pop() {
        // write your code here
        if (stack.peek().equals(minStack.peek())) {
            minStack.pop();
        }
            return stack.pop();
    }

    /*
     * @return: An integer
     */
    public int min() {
        // write your code here
        return minStack.peek();
    }
}
View Code

 

class MinStack {
    Stack<Integer> stack = new Stack<Integer>();
    Stack<Integer> minStack = new Stack<Integer>();

    /** initialize your data structure here. */
    public MinStack() {
        Stack<Integer> stack = new Stack<Integer>();
        Stack<Integer> minStack = new Stack<Integer>();
    }
    
    public void push(int x) {
        //stack: push
        stack.push(x);//s:2
        
        //min stack:push when it's null or minimum 
        if (minStack.isEmpty()) {
            minStack.push(x);
        } else if (x <= minStack.peek()) {
            minStack.push(x); //ms:2
        }
    }
    
    public void pop() {
        //stack:get, min stack: pop when it's mean
        if (minStack.peek().equals(stack.peek())) {
            minStack.pop(); //both 2, ms pop 2
        }
        stack.pop(); //s pop 2
    }
    
    public int top() {
        return stack.peek(); //return s pop 2
    }
    
    public int getMin() {
        return minStack.peek(); //return ms pop 2
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */
View Code

 

解法2: 只用1个stack

[抄题]:

 [暴力解法]:

时间分析:

空间分析:

[奇葩输出条件]:

[奇葩corner case]:

[思维问题]:

不懂题目意思:设计新的数据结构。原生的stack中本来就有push pop peek方法

[一句话思路]:

刷新最小值时 stack中存2个 留着最小值备胎。否则只存1个 要走就走,下面一层还是最小值。

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. pop一个元素之后把备胎也pop出去,以便于下次的pop, 不留痕迹
  2. class中声明后,MinStack()方法用于建立新的数据类型(真心是没话可说了)

[二刷]:

[三刷]:

[四刷]:

[五刷]:

  [五分钟肉眼debug的结果]:

[总结]:

备胎需要斩草除根

[复杂度]:Time complexity: O(1) Space complexity: O(n)

都是立存立取的

[英文数据结构或算法,为什么不用别的数据结构或算法]:

原生的stack中本来就有push pop peek方法

[关键模板化代码]:

[其他解法]:

2个stack

[Follow Up]:

[LC给出的题目变变变]:

716. Max Stack 2个stack

 [代码风格] :

posted @ 2018-01-08 11:48  苗妙苗  阅读(311)  评论(0编辑  收藏  举报