关键词:排序
方法一:在记录这个数的同时,记录目前的最小值。看了提示才写出来的。
方法二:辅助栈。辅助栈保持非严格递减。看了k神的答案。
一开始没想到怎么存最小,看了评论的提示才想到的。
关键:一个栈的一个元素存两样大小:这个数本身,包括这个数在内,目前栈的最小值。
存数的同时存截至到这个数为止的最小数。
注意:min的比较是和栈的前一个min比,不是和全局的min比。
min=(x<stack.back()[1])?x:stack.back()[1];
如果全局的min是1,可是1已经被pop了,但是这个min的记录还会是1,就会出错。
时间复杂度O(n)
空间复杂度O(n)
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
if(stack.empty())
min=x;
else
min=(x<stack.back()[1])?x:stack.back()[1];
stack.push_back({x,min});
}
void pop() {
stack.pop_back();
}
int top() {
return stack.back()[0];
}
int getMin() {
return stack.back()[1];
}
private:
vector<vector<int>> stack;
int min=INT_MAX;
};
/**
* 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();
*/
看了k神。用了两个栈,A栈正常存数,B栈存最小值,B栈要保持非严格递减。
入栈的时候,还需要维护辅助栈。为什么要维护非严格降序的辅助栈:
1、如果:
B.top() >= x
则要把x存进B里面,保持非严格降序,这个时候x就是B里面最小的。
2、如果:
B.top() < x
?则不用存x,因为前面已经有B.top()小于x了,x无论怎么样都不可能是最小值。
出栈的时候,如果B.top()等于要A出栈的那个数,那么B也要跟着出栈。理由当然是因为那个数跑了,所以B当然要一起删掉。
非严格降序:
时间复杂度O(n)
空间复杂度O(n)
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
A.push(x);
if(B.empty()||x<=B.top())
B.push(x);
}
void pop() {
if(A.top()==B.top())
B.pop();
A.pop();
}
int top() {
return A.top();
}
int getMin() {
return B.top();
}
private:
stack<int> A;
stack<int> B;
};
/**
* 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();
*/