QUESTION:
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.
EXPLANATION:
可以直接使用list集合就可以实现,同时我也在leetcode上发现了更加简洁的实现,但是这个实现的话是将原本的数据与min的数据结合在一起,确实可以起到符合题目的目的,但是如果求到size之类的情况时候,原始的数据其实已经被污染了,就没有办法找到一共push了多少个数字进去。
而且如今的电脑性能也许真的不用在意这个了。所以我觉得还是list的解决办法更为靠谱一点。
SOLUTION:
public class MinStack {
Stack<Integer> stack;
int min;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<Integer> ();
min = Integer.MAX_VALUE;
}
public void push(int x) {
if(x <= min){
stack.push(min);
min = x;
}
stack.push(x);
}
public void pop() {
if(stack.isEmpty()){
return;
}
int pop = stack.pop();
if(pop == min){
min = stack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return min;
}
}
public class MinStack {
ArrayList<Integer> list;
Stack<Integer> instance;
/** initialize your data structure here. */
public MinStack() {
instance = new Stack<>();
list = new ArrayList<>();
}
public void push(int x) {
instance.push(x);
list.add(x);
Collections.sort(list);
}
public void pop() {
int tmp = instance.pop();
list.remove((Object)tmp);
}
public int top() {
return instance.peek();
}
public int getMin() {
return list.get(0);
}
}