标签:
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
getMin() – Retrieve the minimum element in the stack.
这是题考查的是栈的基本功能:入栈、出栈、获取栈顶元素,外加一个取栈中最小元素。
正常情况下,入栈、出栈、获取栈顶元素这三个操作都是O(1)的时间复杂度,主要问题就是getMin()了。如果按照一般遍历的做法找最小值,那么getMin()的时间复杂度就是O(n)了。
比较容易想到的就是在push的时候维护该最小值了。如何维护呢?可以想到的是,如果栈顶元素是最小值,那么pop出去的话,如何获得剩余元素的最小值呢?如果要去寻找的话就又是O(n)了。
解决方案就是再维护一个栈——最小栈
。最小栈的栈顶元素永远等于目前原始栈中的最小值。
对原始栈进行push操作时,如果当前元素不大于最小栈的栈顶元素时,则同时入原始栈和最小栈;否则只入原始栈。
对原始栈进行pop操作时,如果栈顶元素等于最小栈的栈顶元素,那么两个栈同时取出栈顶元素,否则只取出原始栈的栈顶元素。
这个解决方案的空间复杂度是O(n)。
下面贴上代码:
class MinStack {
private:
stack<int> S;
stack<int>minS;
public:
void push(int x) {
S.push(x);
if (minS.empty() || minS.top() >= x){
minS.push(x);
}
}
void pop() {
if (S.empty())
return;
int num = S.top();
S.pop();
if (!minS.empty() && minS.top() == num){
minS.pop();
}
}
int top() {
if (S.empty())
exit(1);
return S.top();
}
int getMin() {
if (minS.empty())
exit(1);
return minS.top();
}
};
标签:
原文地址:http://blog.csdn.net/kaitankedemao/article/details/43669619