題目描述
設計一個支持 push,pop,top 等操作並且可以在 O(1) 時間內檢索出最小元素的堆棧。
- push(x)–將元素x插入棧中
- pop()–移除棧頂元素
- top()–得到棧頂元素
- getMin()–得到棧中最小元素
樣例
MinStack minStack = new MinStack(); minStack.push(-1); minStack.push(3); minStack.push(-4); minStack.getMin(); --> Returns -4. minStack.pop(); minStack.top(); --> Returns 3. minStack.getMin(); --> Returns -1.
解法
定義兩個stack,一個為存放最小數的序列的輔助棧。
壓棧時,先將元素 x 壓入 stack1。然后判斷 stack2 的情況:
stack2棧為空或者棧頂元素大於x,則將x壓入stack2中。stack2棧不為空且棧定元素小於x,則重復壓入棧頂元素。
獲取最小元素時,從 stack2 中獲取棧頂元素即可。
import java.util.Stack; public class MinStack { private Stack<Integer> stack1; private Stack<Integer> stack2; public MinStack(){ stack1 = new Stack<>(); stack2 = new Stack<>(); } public void push(int x){ stack1.push(x); if(stack2.isEmpty() || stack2.peek()>x) stack2.push(x); else stack2.push(stack2.peek()); } public void pop(){ stack1.pop(); stack2.pop(); } public int top(){ return stack1.peek(); } public int getMin(){ return stack2.peek(); } }
public static void main(String[] args) { MinStack obj = new MinStack(); obj.push(-1); obj.push(3); obj.push(-4); obj.push(0); obj.pop(); int param_3 = obj.top(); int param_4 = obj.getMin(); System.out.println(param_3+ " "+param_4); }
時間復雜度:O(1)、空間復雜度:O(n)
優化
時間復雜度:O(1)、空間復雜度:O(1)
package com.lisen; import java.util.Stack; public class MinStack { private Stack<Integer> stack; private int min; public MinStack(){ stack = new Stack<>(); } public void push(int x){ if(stack.isEmpty()){ min = x; stack.push(0); }else{ //計算差值 int compareVal = x - min; stack.push(compareVal); min = compareVal < 0 ? x : min; } } public void pop(){ int top = stack.peek(); //如果top小於0,顯然最小值也一並被刪除,此時更新最小值 min = top < 0 ? (min-top) : min; stack.pop(); } public int getMin(){ return min; } }
此方法在數據有限制的情況下適用,否則差值會溢出
