• 剑指:包含min函数的栈(min栈)


    题目描述

    设计一个支持 push,pop,top 等操作并且可以在 O(1) 时间内检索出最小元素的堆栈。

    • push(x)–将元素x插入栈中
    • pop()–移除栈顶元素
    • top()–得到栈顶元素
    • getMin()–得到栈中最小元素

    样例

    MinStack minStack = new MinStack();
    minStack.push(-1);
    minStack.push(3);
    minStack.push(-4);
    minStack.getMin();   --> Returns -4.
    minStack.pop();
    minStack.top();      --> Returns 3.
    minStack.getMin();   --> Returns -1.

    解法

    定义两个stack,一个为存放最小数的序列的辅助栈

    压栈时,先将元素 x 压入 stack1。然后判断 stack2 的情况:

    • stack2 栈为空或者栈顶元素大于 x,则将 x 压入 stack2 中。
    • stack2 栈不为空且栈定元素小于 x,则重复压入栈顶元素。

    获取最小元素时,从 stack2 中获取栈顶元素即可。

    import java.util.Stack;
    
    public class MinStack {
        private Stack<Integer> stack1;
        private Stack<Integer> stack2;
        
        public MinStack(){
            stack1 = new Stack<>();
            stack2 = new Stack<>();
        }
        
        public void push(int x){
            stack1.push(x);
            if(stack2.isEmpty() || stack2.peek()>x)
                stack2.push(x);
            else
                stack2.push(stack2.peek());
        }
        
        public void pop(){
            stack1.pop();
            stack2.pop();
        }
        
        public int top(){
            return stack1.peek();
        }
        
        public int getMin(){
            return stack2.peek();
        }
    }
    public static void main(String[] args) {
        MinStack obj = new MinStack();
        obj.push(-1);
        obj.push(3);
        obj.push(-4);
        obj.push(0);
        obj.pop();
        int param_3 = obj.top();
        int param_4 = obj.getMin();
        System.out.println(param_3+ " "+param_4);
    }
    View Code

    时间复杂度:O(1)、空间复杂度:O(n)

    优化

    时间复杂度:O(1)、空间复杂度:O(1)

    package com.lisen;
    import java.util.Stack;
    
    public class MinStack {
        private Stack<Integer> stack;
        private int min;
        
        public MinStack(){
            stack = new Stack<>();
        }
        
        public void push(int x){
            if(stack.isEmpty()){
                min = x;
                stack.push(0);
            }else{
                //计算差值
                int compareVal = x - min;
                stack.push(compareVal);
                min = compareVal < 0 ? x : min;
            }
        }
        
        public void pop(){
            int top = stack.peek();
            //如果top小于0,显然最小值也一并被删除,此时更新最小值
            min = top < 0 ? (min-top) : min;
            stack.pop();
        }
        
        public int getMin(){
            return min;
        }
    }

     此方法在数据有限制的情况下适用,否则差值会溢出

  • 相关阅读:
    分答是什么?
    判定表
    总结
    周结
    第五周周结
    周结
    一周总结(18周)
    一周总结(17周)
    一周总结(16周)
    一周总结(15周)
  • 原文地址:https://www.cnblogs.com/lisen10/p/11188561.html
Copyright © 2020-2023  润新知