算法 中等 | 12. 带最小值操作的栈

题目描述

实现一个栈, 支持以下操作:

  1. push(val) 将 val 压入栈
  2. pop() 将栈顶元素弹出, 并返回这个弹出的元素
  3. min() 返回栈中元素的最小值
  4. 要求 O(1) 开销.

样例

输入: 
  push(1)
  min()
  push(2)
  min()
  push(3)
  min()
输出: 
  1
  1
  1
注意事项
保证栈中没有数字时不会调用 min()

解题思路

使用两个仅支持 pop 和 push 的栈就可以完成, stack 储存压入的数据, minStack 储存最小值.

  1. push 直接把元素压入 stack, 对于 minStack, 如果它为空则直接压入, 反之压入当前元素与 minStack 栈顶的最小值
  2. pop 两个栈都弹出一个元素, 返回 stack 弹出的元素
  3. min 返回 minStack 的栈顶

还可以令 minStack 为单调栈, 即push时只有元素更小的时候才放入这个栈, 而pop时只有栈顶与stack栈顶相同时才弹出

这样可以节约一定的空间, 但是实质上空间复杂度仍然是 O(n), 且多了一些判断, 并不一定更优

java题解

题解1

public class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;
    
    public MinStack() {
        stack = new Stack<Integer>();
        minStack = new Stack<Integer>();
    }

    public void push(int number) {
        stack.push(number);
        if (minStack.isEmpty()) {
            minStack.push(number);
        } else {
            minStack.push(Math.min(number, minStack.peek()));
        }
    }

    public int pop() {
        minStack.pop();
        return stack.pop();
    }

    public int min() {
        return minStack.peek();
    }
}

题解2

单调栈版本,节省更多空间。
但是空间复杂性并没有改变。

public class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;

    public MinStack() {
        stack = new Stack<Integer>();
        minStack = new Stack<Integer>();
    }

    public void push(int number) {
        stack.push(number);
        if (minStack.empty() == true)
            minStack.push(number);
        else if (minStack.peek() >= number) // 这里考虑的相等的情况也会继续push
            minStack.push(number);
    }

    public int pop() {
        if (stack.peek().equals(minStack.peek()))
            minStack.pop();
        return stack.pop();
    }

    public int min() {
        return minStack.peek();
    }
}

C++题解

题解1

class MinStack
{
  public:
    stack<int> stk, minstk;

    void push(int number)
    {
        stk.push(number);
        if (minstk.empty() or number <= minstk.top())
        {
            minstk.push(number);
        }
    }

    int pop()
    {
        int top = stk.top();
        stk.pop();
        if (top == minstk.top())
        {
            minstk.pop();
        }
        return top;
    }

    int min()
    {
        return minstk.top();
    }
};

题解2

单调栈版本,节省更多空间。
但是空间复杂性并没有改变。

class MinStack
{
  private:
    stack<int> stk, minStk;

  public:
    MinStack()
    {
        // do intialization if necessary
    }

    /*
     * @param number: An integer
     * @return: nothing
     */
    void push(int number)
    {
        stk.push(number);
        if (minStk.empty() || number <= minStk.top())
        {
            minStk.push(number);
        }
    }

    /*
     * @return: An integer
     */
    int pop()
    {
        if (stk.top() == minStk.top())
        {
            minStk.pop();
        }
        int ret = stk.top();
        stk.pop();
        return ret;
    }

    /*
     * @return: An integer
     */
    int min()
    {
        return minStk.top();
    }
};

python题解

题解1

class MinStack:
    
    def __init__(self):
        self.stack = []
        self.minStack = []

    """
    @param: number: An integer
    @return: nothing
    """
    def push(self, number):
        self.stack.append(number)
        if len(self.minStack) == 0:
            self.minStack.append(number)
        else:
            self.minStack.append(min(number, self.minStack[-1]))

    """
    @return: An integer
    """
    def pop(self):
        ret = self.stack[-1]
        del(self.stack[-1], self.minStack[-1])
        return ret

    """
    @return: An integer
    """
    def min(self):
        return self.minStack[-1]

题解2

单调栈版本,节省更多空间。
但是空间复杂性并没有改变。

class MinStack:
    
    def __init__(self):
        self.stack = []
        self.minStack = []

    """
    @param: number: An integer
    @return: nothing
    """
    def push(self, number):
        self.stack.append(number)
        if len(self.minStack) == 0:
            self.minStack.append(number)
        else:
            self.minStack.append(min(number, self.minStack[-1]))

    """
    @return: An integer
    """
    def pop(self):
        ret = self.stack[-1]
        del(self.stack[-1], self.minStack[-1])
        return ret

    """
    @return: An integer
    """
    def min(self):
        return self.minStack[-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值