題目
定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的 min 函數在該棧中,調用 min、push 及 pop 的時間復雜度都是 O(1)。
示例:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -2.
提示:
- 各函數的調用總次數不超過 20000 次
解題思路
1.題目要求我們實現一個能夠得到棧的最小元素的 min 函數,且調用 min、push 及 pop 的時間復雜度都是 O(1)。我們需要用到兩個棧去解決這個問題。
2.舉個例子:
下面我們開始進行入棧操作,在入棧第一個元素時Stack1直接入棧,而當Stack2為空時我們也將元素直接入棧。
?在入棧第二個元素時Stack1依舊直接入棧,這時我們發現要入棧的元素大于Stack2的棧頂元素,所以我們不對Stack2進行入棧操作,
以下入棧操作的思路相同,Stack1正常入棧,Stack2只有在空的時候或者棧頂元素大于被入棧元素時才進行入棧。
?此時入棧操作全部執行結束,我們來看看出棧操作,
在出棧操作時,我們需要先判斷Stack1是否為空,要保證我們有元素可以出棧,當Stack1不為空時,Stack2一定也不為空。然后我們將Stack1的棧頂元素與Stack2的棧頂元素進行比較,若兩元素不同,則只將Stack1進行出棧,否則就要將Stack1和Stack2同時出棧。
出棧操作執行結束。
3,還有最后兩個方法,pop()求棧頂元素時我們只需要返回Stack1的棧頂即可,min()求棧中最小元素時我們只需要返回Stack2的棧頂元素即可。?
代碼實現
class MinStack {Stack<Integer> Stack1;Stack<Integer> Stack2;/** initialize your data structure here. */public MinStack() {Stack1 = new Stack();Stack2 = new Stack();}public void push(int x) {Stack1.push(x);if(Stack2.isEmpty() || x <= Stack2.peek() ){Stack2.push(x);}}public void pop() {if(!Stack1.isEmpty()){//數值大于 127,比較的就是一個對象if(Stack1.peek().intValue() == Stack2.peek().intValue()){Stack2.pop();}Stack1.pop();}}public int top() {return Stack1.peek();}public int min() {return Stack2.peek();}
}