zoukankan      html  css  js  c++  java
  • 剑指:包含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;
        }
    }

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

  • 相关阅读:
    LeetCode 258 Add Digits
    LeetCode 231 Power of Two
    LeetCode 28 Implement strStr()
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 21 Merge Two Sorted Lists
    LeetCode 20 Valid Parentheses
    图形处理函数库 ImageTTFBBox
    php一些函数
    func_get_arg(),func_get_args()和func_num_args()的用法
    人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  • 原文地址:https://www.cnblogs.com/lisen10/p/11188561.html
Copyright © 2011-2022 走看看