設計一個支持 push,pop,top 操做,並能在常數時間內檢索到最小元素的棧。bash
示例:
ui
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.複製代碼
剛看到題目。。本身第一個想法是要不要開一個鏈表慢慢比較棧中數據的大小。。後來百度一下,看到了正確思路。spa
首先開兩個棧,一個棧a(放元素x),一個棧b(放最小值)。每當有元素x進棧時,元素x先跟棧b的棧頂比較,若是元素x比棧頂元素小,元素x入棧a、b;若是元素x大於棧頂元素,元素x入棧a。出棧時,出棧元素跟棧b的棧頂比較,若是出棧元素與棧b棧頂相等,棧b.pop()。這種方法可以避免,若是當前棧的最小值出棧時,就沒法找到棧的最小值。設計
代碼實現:code
鏈表實現:rem
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);
}
}複製代碼
棧實現:get
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();
}
}
複製代碼