力扣 hot100 Day60
155. 最小栈
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
class MinStack {
private:stack<int> main_stack;stack<int> min_stack;public:MinStack() {}void push(int val) {main_stack.push(val);if (min_stack.empty() || val <= min_stack.top()) {min_stack.push(val);}}void pop() {if (main_stack.top() == min_stack.top()) {min_stack.pop();}main_stack.pop();}int top() {return main_stack.top();}int getMin() {return min_stack.top();}
};
我的思路是维护一个有序数组,这样就能直接得到当前最小值了
但不必这么复杂,由于这是个栈,所以只会像栈一样读入读出,只需要在栈读入读出时维护一个当前最小值的栈即可
具体来说,入栈时,栈空或当前值小于最小栈顶,同步入最小栈;出栈时,等于最小栈顶则同步出
最小栈中不一定有所有元素,但一定有栈维护时任意时刻的最小值,相当于历史快照,这就足够了