zoukankan      html  css  js  c++  java
  • 栈--getMin(leetcode 155)

    1.具有getMin功能的最小栈

    要求pop,push,getMin操作的时间复杂度都是O(1)

    思路

    “以空间换时间”,使用辅助栈是常见的做法。

    使用两个栈,stackData用于保存存到栈里的数据,stackMin用于保存当前stackData中的最小值

    方法1:

    • push方法:stackData直接push,stackMin为空时,也直接push到stackMin;stackMin不为空时,比较要压入的元素和stackMin栈顶元素,如果要压入的小于或等于stackMin的栈顶,便压入stackMin,否则不压入stackMin
    • pop方法:stackData直接pop,如果要pop的元素等于stackMin的栈顶,那么stackMin也pop,否则stackMin不pop
    • getMin方法:stackMin的栈顶元素即为所求

    方法2:

    • push方法:stackData直接push,stackMin为空时,也直接push到stackMin;stackMin不为空时,比较要压入的元素和stackMin栈顶元素,如果要压入的小于或等于stackMin的栈顶,便压入stackMin;否则,将stackMin的栈顶元素再压入stackMin一次
    • pop方法:两个栈都pop,return stackData pop出来的值
    • getMin方法:stackMin的栈顶元素

    方法1和方法2的共同点在于所有操作的时间复杂度都是O(1),空间复杂度都是O(n).区别是:方法1压入时节省空间,弹出时费时间;方法2压入时费空间,弹出时省时间.

    代码

    方法1:

    class MyStack{
        private Stack<Integer> stackData;
        private Stack<Integer> stackMin;
    
        public MyStack(){
            this.stackData = new Stack<Integer>();
            this.stackMin = new Stack<Integer>();
        }
    
        public void push(int newNum){
            if(this.stackMin.isEmpty()){
                this.stackMin.push(newNum);
            }else if(newNum<=this.getMin()){
                this.stackMin.push(newNum);
            }
            this.stackData.push(newNum);
        }
    
        public int pop(){
            if(this.stackData.isEmpty()){
                throw new RuntimeException("your stack is empty");
            }else{
                int value = this.stackData.pop();
                if(value==this.getMin()){
                    this.stackMin.pop();
                }
                return value;
            }
        }
    
        public int getMin(){
            if(this.stackMin.isEmpty()){
                throw new RuntimeException("your stack is empty");
            }else{
                return this.stackMin.peek();
            }
        }
    
    
    }
    
    public class Main {
        public static void main(String[] args) {
            MyStack stack = new MyStack();
            stack.push(3);
            stack.push(4);
            stack.push(5);
            stack.push(1);
            stack.push(2);
            stack.push(1);
            int a = stack.getMin();
            System.out.println("ans="+a);
        }
    }
    

    方法2:

    class MyStack{
        private Stack<Integer> stackData;
        private Stack<Integer> stackMin;
    
        public MyStack(){
            this.stackData = new Stack<Integer>();
            this.stackMin = new Stack<Integer>();
        }
    
        public void push(int newNum){
            if(this.stackMin.isEmpty()){
                this.stackMin.push(newNum);
            }else if(newNum<=this.getMin()){
                this.stackMin.push(newNum);
            }else{
                int newMin = this.stackMin.peek();
                this.stackMin.push(newMin);
            }
            this.stackData.push(newNum);
        }
    
        public int pop(){
            if(this.stackData.isEmpty()){
                throw new RuntimeException("your stack is empty");
            }else{
                this.stackMin.pop();
                return this.stackData.pop();
            }
        }
    
        public int getMin(){
            if(this.stackMin.isEmpty()){
                throw new RuntimeException("your stack is empty");
            }else{
                return this.stackMin.peek();
            }
        }
    
    
    }
    
    public class Main {
        public static void main(String[] args) {
            MyStack stack = new MyStack();
            stack.push(3);
            stack.push(4);
            stack.push(5);
            stack.push(1);
            stack.push(2);
            stack.push(1);
            int a = stack.getMin();
            System.out.println("ans="+a);
        }
    }
    

    出处:程序员代码面试指南

  • 相关阅读:
    基于Ubuntu Jeos打造自己的精简版Linux服务器
    35 vs 53怎么裁
    父母在,不远游
    linux deepin是基于linux mint修改
    novell
    Sahi
    virtualbox on windows store vdi on ndfs due the file will bigger than 4gb
    在Linux下配置邮件系统
    CSS3 backgroundsize 属性
    dede:list及dede:arclist 按权重排序的方法
  • 原文地址:https://www.cnblogs.com/swifthao/p/12761438.html
Copyright © 2011-2022 走看看