設計一個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。
- push(x) -- 將元素 x 推入棧中。
- pop() -- 刪除棧頂的元素。
- top() -- 獲取棧頂元素。
- getMin() -- 檢索棧中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.複製程式碼
剛看到題目。。自己第一個想法是要不要開一個連結串列慢慢比較棧中資料的大小。。後來百度一下,看到了正確思路。
首先開兩個棧,一個棧a(放元素x),一個棧b(放最小值)。每當有元素x進棧時,元素x先跟棧b的棧頂比較,如果元素x比棧頂元素小,元素x入棧a、b;如果元素x大於棧頂元素,元素x入棧a。出棧時,出棧元素跟棧b的棧頂比較,如果出棧元素與棧b棧頂相等,棧b.pop()。這種方法能夠避免,如果當前棧的最小值出棧時,就無法找到棧的最小值。
程式碼實現:
連結串列實現:
class MinStack {
private List<Integer> data;
private List<Integer> min;
/** initialize your data structure here. */
public MinStack() {
data = new ArrayList<>();
min = new ArrayList<>();
}
public void push(int x) {
if(data.isEmpty() || x <= min.get(min.size()-1)) {
min.add(x);
}
data.add(x);
}
public void pop() {
if(data.get(data.size()-1).equals(min.get(min.size()-1))){
min.remove(min.size()-1);
}
data.remove(data.size()-1);
}
public int top() {
return data.get(data.size()-1);
}
public int getMin() {
return min.get(min.size()-1);
}
}複製程式碼
棧實現:
class MinStack {
private Stack<Integer> data;
private Stack<Integer> min;
/** initialize your data structure here. */
public MinStack() {
data = new Stack();
min = new Stack();
}
public void push(int x) {
if(data.isEmpty() || x <= min.peek()) {
min.push(x);
}
data.push(x);
}
public void pop() {
if(data.peek().equals(min.peek())){
min.pop();
}
data.pop();
}
public int top() {
return data.peek();
}
public int getMin() {
return min.peek();
}
}
複製程式碼