1. 程式人生 > >LeetCode第155題 最小棧

LeetCode第155題 最小棧

str 兩個棧 pop 入棧 .get turn 如果 ros ...

設計一個支持 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.



思路: 使用太多封裝雖然偷了懶,效率影響確實很大...

使用兩個棧,一個保存真實的數據,另一個保存所有最小值

eg:
push : -1 0 -2 3 4
push操作完成後,兩個棧的情況如下:
stack: -1 0 -2 3 4
minData: -1 -2

只要當前mindata的top(-2)未被彈出,棧中的最小值就一直是-2.
如果此時stack彈出的值為(-2),那麽mindata中的值也要更新,將-2彈出.
那麽此時
stack: -1 0

minData: -1
棧中的最小值就為-1了


 1 class MinStack {
 2 
 3   /**
 4    * initialize your data structure here.
 5    */
 6   private Stack<Integer> stack;     //
 7   private Stack<Integer> minData;   //保存最小值的棧
 8 
 9   public MinStack() {
10 
11     stack = new Stack<>();
12     minData = new
Stack<>(); 13 } 14 15 public void push(int x) { 16 stack.push(x); 17 if (minData.empty() || minData.peek() >= x) { 18 minData.push(x); 19 } 20 } 21 22 public void pop() { 23 if (stack.peek().equals(minData.peek())) { 24 minData.pop(); 25 } 26 stack.pop(); 27 } 28 29 public int top() { 30 return stack.peek(); 31 } 32 33 public int getMin() { 34 return minData.peek(); 35 } 36 }

LeetCode第155題 最小棧