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.
Have you met this question in a real interview?
思路1:用两个stack
class MinStack {
Stack<Integer> minstack;
Stack<Integer> stack;
/** initialize your data structure here. */
public MinStack() {
this.minstack = new Stack<Integer>();
this.stack = new Stack<Integer>();
}
public void push(int x) {
stack.push(x);
if(minstack.isEmpty() || minstack.peek() >= x) {
minstack.push(x);
}
}
public void pop() {
int peekvalue = stack.pop();
if(peekvalue == minstack.peek()) {
minstack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return minstack.peek();
}
}
/**
* 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:用linked list来模拟这个stack,node --> node,定义一个node class来每次维护这个min,这样也是const time。
class MinStack {
Node top = null;
public void push(int x) {
if(top==null){
Node temp = new Node(x);
temp.min = x;
top = temp;
}else{
Node temp = new Node(x);
temp.min = Math.min(top.min, x);
temp.next = top;
top = temp;
}
}
public void pop() {
top = top.next;
return;
}
public int top() {
return top == null ? 0: top.val;
}
public int getMin() {
return top == null ? 0: top.min;
}
public class Node{
int val ;
Node next;
int min;
public Node(int val){
this.val=val;
}
}
}