题目如下
这道题要求min(),push(),pop()的时间复杂度都是O(1),只用一个栈是实现不了的,为什么?栈的最明显的特点就是:最后进去的元素最新出来。用一个栈的话,每次都要确保最小的元素在栈顶,但最后进栈的元素不保证都是最小的,所以用一个栈就实现不了。本题要求的时间复杂度的最优,那可以用空间换时间的思想,借助一个辅助栈来实现它。
class MinStack {
public:
/** initialize your data structure here. */
stack<int>stack1;//第一次报错是因为我把s写成大写的了
stack<int>stack2;
int back1;
int back2;
MinStack() {
while (!stack1.empty())
stack1.pop();
while (!stack2.empty())
stack2.pop();
}
void push(int x) {
stack1.push(x);
if (stack2.size() == 0 || stack2.top() > x)
stack2.push(x);
else
stack2.push(stack2.top());//如果新入栈的元素没有比辅助栈的栈顶元素小,就把辅助栈的栈顶元素再次压进辅助栈中去,确保数据栈中的元素数量和辅助栈中的元素数量保持一致
}
void pop() {
if (!stack1.empty() && !stack2.empty())
{
stack1.pop();
stack2.pop();
}
}
int top() {
if (!stack1.empty())
{
back1 = stack1.top();
}
return back1;
}
int min() {
if (!stack2.empty())
{
back2 = stack2.top();
}
return back2;
}
};
/**
* 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();
*/
这题是我今日待办事项的第一件事(其实是开始刷剑指第一天的题目,今天是第三天,昨天没有写),我就是严格按照视频里说的,先开始再说,每次做一点,而且要在多巴胺充足的时候做,没有拖泥带水,我一上来就是先看剑指这书(图书馆的)的解释,然后看看吴师兄的解析(也没啥的),然后就开始写了,没有很痛苦,我也不想去看吴师兄的题解,因为他是用java写的(又在乎语言了。。。),C++yyds.