• 栈--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);
        }
    }
    

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

  • 相关阅读:
    pyqt-QGrapicsView类
    pyqt5.0 GraphicsView框架
    STM32(三)- GPIO输入输出之按键检测点亮LED
    STM32(二)- 位带操作、启动文件讲解
    STM32(一)- 基于固件库的工程模板
    C语言(四)- C预处理和C库
    C语言(三)- 结构体、结构体指针、位运算
    C语言(二)- 函数、指针、数组
    C语言(一)- 基础知识
    [caffe笔记]:杀死caffe多个进程中的某个(发生 leveldb lock 解决方法)
  • 原文地址:https://www.cnblogs.com/swifthao/p/12761438.html
Copyright © 2020-2023  润新知