设计一个支持 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://ichenhua.cn/read/385