剑指 Offer 30. 包含min函数的栈

62 阅读1分钟

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.

解题思路: 最小栈辅助法

  1. 初始化时, 我们创建2个栈, 第一个为主栈, 存放所有元素. 第二个为最小栈, 存放存在过的最小值元素(栈顶为最小值).
  2. 入栈时, 主栈先入栈. 如果入栈元素小于最小栈的栈顶元素, 就将入栈元素入栈最小栈, 保障当前元素入栈以后, 最小栈的栈顶为所有元素的最小值
  3. 出栈时, 主栈先出栈. 如果最小栈的栈顶元素与出栈元素相同, 那么将最小栈的栈顶也出栈, 那么最小栈的栈顶就是当前出栈元素未加入时历史的最小值
  4. top()函数直接返回主栈的栈顶元素
  5. min()函数直接返回最小栈的栈顶元素

示例代码

class MinStack:

    def __init__(self):
        self.mins, self.all = [], []


    def push(self, x: int) -> None:
        self.all.append(x)
        if not self.mins or self.mins[-1] >= x:
            self.mins.append(x)

    def pop(self) -> None:
        if self.all.pop() == self.mins[-1]:
            self.mins.pop()

    def top(self) -> int:
        return self.all[-1]

    def min(self) -> int:
        return self.mins[-1]