输入:
一个整数序列,通过 push、pop、top、getMin 四种操作来维护栈。
要求:
实现一个支持常数时间内检索最小元素的栈类 MinStack,支持以下操作:
-
push(x):将元素 x 入栈
-
pop():移除栈顶元素
-
top():返回栈顶元素
-
getMin():返回栈中最小元素
输出:
每次操作对应的返回结果。
思路:
维护两个栈:
-
主栈 mainStack 保存所有元素;
-
辅助栈 minStack 保存对应时刻的最小值。
当压入元素时:
-
若 minStack 为空,直接压入;
-
若新值小于等于当前最小值,也压入 minStack。
当弹出元素时:
-
如果主栈弹出的值等于 minStack 的栈顶,则同步弹出 minStack。
这样每次取最小值只需返回 minStack 的栈顶,时间复杂度为 O(1)。
复杂度:
时间复杂度:O(1)
空间复杂度:O(n)
class MinStack {
private:
stack<int> mainStack;
stack<int> minStack;
public:
MinStack() {
stack<int> mainStack;
stack<int> minStack;
}
void push(int val) {
mainStack.push(val);
if (minStack.empty()) {
minStack.push(val);
}
else if (val <= minStack.top()) {
minStack.push(val);
}
}
void pop() {
int tmp = mainStack.top();
mainStack.pop();
if (tmp == minStack.top()) {
minStack.pop();
}
}
int top() {
return mainStack.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();
*/
248

被折叠的 条评论
为什么被折叠?



