设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

- MinStack() 初始化堆栈对象。

- void push(int val) 将元素val推入堆栈。

- void pop() 删除堆栈顶部的元素。

- int top() 获取堆栈顶部的元素。

- int getMin() 获取堆栈中的最小元素。

示例

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

解析

1)首先要清楚栈结构的特性,先进后出,只能用 list 的 append() 和 pop() 方法;

2)本题的考点在于快速取到最小值,考虑到有 pop() 操作,所以维护一个和 stack 等长的最小值序列;

3)在 push() 时,需要拿当前 push() 进来的值,和已存在最小值序列对比,取较小的值填充;

4)这样就可以保证最小值序列的最后一个值,是序列的最小值,且 pop() 时可以和 stack 一起维护。

代码示例

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

    def push(self, val: int) -> None:
        self.stack.append(val)
        self.min.append(val if not self.min else min(self.min[-1], val))

    def pop(self) -> None:
        self.min.pop()
        return self.stack.pop()

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

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

本文为 陈华 原创,欢迎转载,但请注明出处:http://www.ichenhua.cn/read/385