最小栈
题目:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
输入:
示例:["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
思路:得到最小元素,需要设计一个数据结构,使得每个元素a与其相应的最小值m时刻保持一一对应。因此需要一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。
1.当一个元素要入栈时,要去当前辅助栈的栈顶存储最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中。
2.当一个元素要出栈,把辅助栈的栈顶元素也一并弹出
3.在任意时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。

复杂度分析
时间复杂度:题目中所有的操作的时间复杂度都为O(1)。因为栈的插入、删除与读取操作都是 O(1),我们定义的每个操作最多调用栈操作两次。
空间复杂度:O(n),其中 n为总操作数。最坏情况下,我们会连续插入n个元素,此时两个栈占用的空间为 O(n)。