LeetCode OJ 155. Min Stack
Description
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.
Example
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); –> Returns -3.
minStack.pop();
minStack.top(); –> Returns 0.
minStack.getMin(); –> Returns -2.
方法1
使用两个stack
stack<int> s
存储输入的数,stack<int> min
存储当前的最小值序列,栈顶元素为当前栈s的最小值。
push(x)操作:x直接入栈s;如果栈min为空或者当x<=min
的栈顶元素,x入栈min,否则不需要入栈min。
pop()操作:当栈s的栈顶元素等于min的栈顶元素,则两个栈都要做出栈操作,否则只有s做出栈操作。
top()操作:返回s的栈顶元素。
getMin()操作:返回min的栈顶元素。
代码
class MinStack {
public:
stack<int> s;
stack<int> min;
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
s.push(x);
if(min.empty() || x <= min.top())
min.push(x);
}
void pop() {
if(s.top() == min.top()){
s.pop();
min.pop();
}
else
s.pop();
}
int top() {
return s.top();
}
int getMin() {
return 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.getMin();
*/
方法2
使用一个stack和一个变量min
stack<int> s
存储输入的数,min 存储当前的最小值。
push(x)操作:若x<=min
,min入栈s,x复制给min,x入栈s。否则,x直接入栈s。实际上就是在push的过程中记录下当前最小值的上一个最小值,如果当前最小值出栈了,余下元素的最小值就是栈顶元素。
pop()操作:当栈s的栈顶元素等于min时,s出栈,根据pop(x)操作,此时的栈顶元素就是余下栈内数据的最小值,把当前栈顶元素赋值给min。否则s只做一次出栈操作。
top()操作:返回s的栈顶元素。
getMin()操作:返回min。
代码
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
// one stack and a variable
stack<int> s;
int min = INT_MAX;
void push(int x) {
if(x <= min){
s.push(min);
min = x;
}
s.push(x);
}
void pop() {
if(s.top() == min){
s.pop();
min = s.top();
}
s.pop();
}
int top() {
return s.top();
}
int getMin() {
return min;
}
};
/**
* 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();
*/