【LeetCode】Min Stack 解題報告
阿新 • • 發佈:2019-02-12
【題目】
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.
來自:https://oj.leetcode.com/discuss/15659/simple-java-solution-using-two-build-in-stacks?state=edit-15691&show=15659#q15659
class MinStack { // stack: store the stack numbers private Stack<Integer> stack = new Stack<Integer>(); // minStack: store the current min values private Stack<Integer> minStack = new Stack<Integer>(); public void push(int x) { // store current min value into minStack if (minStack.isEmpty() || x <= minStack.peek()) minStack.push(x); stack.push(x); } public void pop() { // use equals to compare the value of two object, if equal, pop both of them if (stack.peek().equals(minStack.peek())) minStack.pop(); stack.pop(); } public int top() { return stack.peek(); } public int getMin() { return minStack.peek(); } }
【分析】
這道題的關鍵之處就在於 minStack 的設計,push() pop() top() 這些操作Java內建的Stack都有,不必多說。
我最初想著再弄兩個陣列,分別記錄每個元素的前一個比它大的和後一個比它小的,想複雜了。
第一次看上面的程式碼,還覺得它有問題,為啥只在 x<minStack.peek() 時壓棧?如果,push(5), push(1), push(3) 這樣minStack裡不就只有5和1,這樣pop()出1後, getMin() 不就得到5而不是3嗎?其實這樣想是錯的,因為要想pop()出1之前,3就已經被pop()出了。.
minStack 記錄的永遠是當前所有元素中最小的,無論 minStack.peek() 在stack 中所處的位置。
【不用內建Stack的實現】
來自:https://oj.leetcode.com/discuss/15651/my-java-solution-without-build-in-stack
class MinStack {
Node top = null;
public void push(int x) {
if (top == null) {
top = new Node(x);
top.min = x;
} else {
Node temp = new Node(x);
temp.next = top;
top = temp;
top.min = Math.min(top.next.min, x);
}
}
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;
}
}
class Node {
int val;
int min;
Node next;
public Node(int val) {
this.val = val;
}
}