实现最小栈的问题。
最简单的思想是用两个栈来做。
一个存当前的数值,另外一个存储的是当前数值之前的最小数值。
每个数都对应一个当前数值之前的最小数。
那么就能实现最小stack的问题了。
比如: 3 5 2 1
stack: 3 1 5 9
minStack:3 1 1 1
如何优化那?
上面的例子里minStack 存了多个1
我们可以不存这么多,只存一个1.
如果当要pop stack的元素是1的时候再pop minStack的1。
但是有个特例
比如
3 2 2 1 2
minStack 3, 2, 1
有多个2的时候,就没有办法用上面的办法了。因为多个2 不知道pop的是那个。
所以如果有多个元素,就得多次push进minStack。
上面的例子就变成了
minStack 3, 2 2, 1
class MinStack {
stack<int> minStack;
stack<int> stack;
public:
MinStack() {
}
void push(int val) {
if(minStack.empty() || val <= minStack.top()){
minStack.push(val);
}
stack.push(val);
}
void pop() {
if(minStack.top() == stack.top())
minStack.pop();
stack.pop();
}
int top() {
return stack.top();
}
int getMin() {
return minStack.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/