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.
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.
設計一個棧 有一個getMin的方法 每次獲取stack中的最小值 時間複雜度O(1)
設最小值爲min 關鍵在於min的維護
push的時候簡單 只要一直取Math.min就可以了
當pop的時候 如果pop的正好是最小值 怎樣找到上一次的最小值呢
比如 輸入是 2,3,1
pop掉1後 最小值應該變爲2 但是怎樣找到2呢
比較常規的做法 再用一個minstack 每次只放入比當前min小的值 相當於是維護了一個最小值的集合
如果pop掉當前最小值 那麼min = stack.pop();
class MinStack {
int min = Integer.MAX_VALUE;
Stack<Integer> stack = new Stack<Integer>();
public void push(int x) {
// only push the old minimum value when the current
// minimum value changes after pushing the new value x
if(x <= min){
stack.push(min);
min=x;
}
stack.push(x);
}
public void pop() {
// if pop operation could result in the changing of the current minimum value,
// pop twice and change the current minimum value to the last minimum value.
if(stack.pop() == min) min=stack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return min;
}
}
第二種做法不是很好想 只用一個stack
當有新的最小值 先push之前的最小值 這樣 pop當前最小值後 可以找到上一次的最小值
class MinStack {
int min = Integer.MAX_VALUE;
Stack<Integer> stack = new Stack<Integer>();
public void push(int x) {
// only push the old minimum value when the current
// minimum value changes after pushing the new value x
if(x <= min){
stack.push(min);
min=x;
}
stack.push(x);
}
public void pop() {
// if pop operation could result in the changing of the current minimum value,
// pop twice and change the current minimum value to the last minimum value.
if(stack.pop() == min) min=stack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return min;
}
}