题目地址
解题思路
要实现栈的push()
和pop()
操作非常简单,直接st.push()
和st.pop()
就好。
但是如何在O(1)的情况下返回栈的最小元素值呢?
想到:每次向栈里面push
新元素的时候,我们取当前栈中最小的元素和新元素进行对比,然后择小,将其push
进一个只存放(阶段小元素)的栈st_min
中。
这样一来,栈st_min
中的top()
永远存放的是栈的最小元素。当我们需要返回最小元素时,只需要return st_min.top();
代码实现(C++)
class MinStack {
public:
/** initialize your data structure here. */
stack<int> st1;
stack<int> st_min;
MinStack()
{
st_min.push(INT_MAX);
}
void push(int x)
{
st1.push(x);
st_min.push(std::min(st_min.top(),x)); //这里不能直接调用min函数,因为在下面重写了,需要写成std::min()
}
void pop()
{
//如何处理pop这个操作其实也很关键
//我们每次push元素的时候,都是把要push的元素和当前栈中最小的元素做对比,择小的push进去st_min
//而当我们要pop元素时,我们会遇到两种情况:
//1.st1中的top元素和我们st_min中的top元素相同(此时无需考虑,直接pop即可)
//2.st1中的top元素比我们st_min的top元素要大(也就是说st_min中的最小元素值最少有一个备份,所以也是直接pop即可)
st1.pop();
st_min.pop();
}
int top()
{
return st1.top();
}
int min()
{
return st_min.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->min();
*/