剑指:包含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;
    }
}

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

 

posted @ 2019-07-15 14:29  亦海  阅读(1612)  评论(0编辑  收藏  举报