剑指offer_20:包含min函数的栈

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

示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.

提示:
各函数的调用总次数不超过 20000 次

1、用栈做

class MinStack {
    Stack<Integer> stack;
    Stack<Integer> minStack;
    /** initialize your data structure here. */
    public MinStack() {
        stack=new Stack<>();
        minStack=new Stack<>();
    }
    
    public void push(int x) {
        stack.push(x);
        if(minStack.isEmpty()){
            minStack.push(x);
        }else{
            if(minStack.peek()>=x){
                //这里用>=而不是>,是因为
                //若stack压入两个2,min栈压入一个2;
                //再弹出一个2,min栈也弹出一个2,这时min栈为空,但stack栈仍然有最小值
                //所以要加上一个=号
                minStack.push(x);
            }
        }
    }
    
    public void pop() {
        if(stack.peek().equals(minStack.peek())){
            minStack.pop();
        }
        stack.pop();
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int min() {
        return minStack.peek();
    }
}

/**
 * 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.min();
 */

2、用链表做

class MinStack {
    private class Node{
        int val;
        int min;
        Node next;
        public Node(int val,int min){
            this.val=val;
            this.min=min;
        }
    }
    private Node head;
    /** initialize your data structure here. */
    public MinStack() {
    }
    
    public void push(int x) {
        if(head==null){
            head=new Node(x,x);
        }else{
            //头插法(伪)
            Node node=new Node(x,head.min>=x?x:head.min);
            node.next=head;
            head=node;
        }
    }
    
    public void pop() {
        head=head.next;
    }
    
    public int top() {
        return head.val;
    }
    
    public int min() {
        return head.min;
    }
}

/**
 * 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.min();
 */
posted @ 2020-12-17 20:18  小昊子丫  阅读(48)  评论(0编辑  收藏  举报