• 剑指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();
     */
    
  • 相关阅读:
    mysql中去重复记录
    php数组操作,内容相同,键值不同,互换
    windows和linux下目录分隔符兼容问题(换行回车兼容)
    Windows安装Redis的php扩展
    web.xml中:<context-param>与<init-param>的区别与作用及获取方法
    classpath 和 classpath*的 区别:
    Several ports (8005, 8080, 8009) required
    maven:mirrors和repository的关系区别
    xml中${}的使用含义(美元符号大括号,以Spring、ibatis、mybatis为例)
    mysql 、redis的区别
  • 原文地址:https://www.cnblogs.com/xyz-1024/p/14151706.html
Copyright © 2020-2023  润新知