zoukankan      html  css  js  c++  java
  • 剑指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();
     */
    
  • 相关阅读:
    UVa 839 Not so Mobile
    UVa 548 Tree(中序遍历+后序遍历)
    UVa-679 Dropping Balls(二叉树的编号)
    Vue练习三十一:04_04_arguments应用_求出参数的和
    Vue练习三十:04_03_自动改变方向播放_幻灯片效果
    Vue练习二十九:04_02_自动播放_幻灯片效果
    Vue练习二十八:04_01_transition应用(未完成)
    Vue练习二十七:03_09_倒计时时钟
    Vue练习二十六:03_08_简易网页时钟
    Vue练习二十五:03_07_网页计算器
  • 原文地址:https://www.cnblogs.com/xyz-1024/p/14151706.html
Copyright © 2011-2022 走看看