面试题 03.02. 栈的最小值
请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。
- 示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
解法一:
使用两个栈,一个栈s存储所有入栈的元素,另一个栈m用来存储最小值。
- 当进行push操作时候,先判断当前要入栈的元素x是否比最小栈栈顶的元素要小,如果是的话,将元素x压入栈s的同时将x也压入最小栈m。
- 当进行pop操作时候,判断s栈顶元素和m栈顶元素是否相同,如果相同的话,将s和m的栈顶元素都pop,否则的话,只将s的栈顶元素pop。
- 当进行getMin操作时候,直接返回m栈顶的元素。
class MinStack {
public:
/** initialize your data structure here. */
stack<int> s;
stack<int> m;
MinStack() {
}
void push(int x) {
s.push(x);
if(m.empty() || x <= m.top())
m.push(x);
}
void pop() {
if(s.top() == m.top())
m.pop();
s.pop();
}
int top() {
return s.top();
}
int getMin() {
return m.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
解法二:
类似于解法一的思想,但是不另外开辟新的栈,而是用变量min存储栈中的最小值。
- 当进行push操作的时候,如果要push的元素x比min还要小,那么就先将min压入栈中,再将x压入栈中,同时更新栈的最小值min。
- 当进行pop操作的时候,如果栈顶元素的值等于min,那么将栈顶元素pop掉,同时将栈顶元素的下一个元素赋值给min,然后再将它pop掉。
- 当进行geiMin操作的时候,直接返回min。
class MinStack {
public:
/** initialize your data structure here. */
stack<int> s;
int MIN = INT_MAX;
MinStack() {
}
void push(int x) {
if(x <= MIN)
{
s.push(MIN);
MIN = x;
}
s.push(x);
}
void pop() {
if(MIN == s.top())
{
s.pop();
MIN = s.top();
}
s.pop();
}
int top() {
return s.top();
}
int getMin() {
return MIN;
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/