力扣 - 劍指 Offer 30. 包含min函式的棧

linzeliang發表於2021-11-09

題目

劍指 Offer 30. 包含min函式的棧

思路1

  • 使用一個輔助棧min_stack,用來維護棧的最小的元素
  • 每次新增元素入棧時候,data_stackmin_stack都要同時維護
  • data_stack按照正常的棧壓入和彈出順序,但是min_stack棧不一樣,因為要能獲取當前棧的最小元素:
    • 如果棧是空的,直接入棧
    • 如果棧不是空的,分兩種情況:
      1. 待入棧的元素x小於min_stack棧頂的元素,此時直接將x壓入min_stack
      2. 待入棧的元素x大於min_stack棧頂的元素,此時將當前棧頂元素再次壓入棧頂

程式碼

class MinStack {

    LinkedList<Integer> data_stack;
    // min_stack為輔助棧
    LinkedList<Integer> min_stack;

    public MinStack() {
        // 初始化
        data_stack = new LinkedList<>();
        min_stack =  new LinkedList<>();
    }
    
    public void push(int x) {
        data_stack.push(x);
        // 入棧的時候要判斷輔助棧是否為空,空的話直接push即可
        if (!min_stack.isEmpty()) {
            // 判斷待入棧的元素x是否大於min_stack棧頂元素,如果小於直接入棧;若大於,則將原來棧頂的元素再次入棧一次
            if (x < min_stack.peek()) {
                min_stack.push(x);
            } else {
                min_stack.push(min_stack.peek());
            }
        } else {
            min_stack.push(x);
        }
    }
    
    public void pop() {
        // 如果pop的話直接彈出去
        // 這裡不用擔心min_stack輔助棧的最小元素被pop出去,因為min_stack和data_stack是一一對應的,同時pop出去對獲取當前棧的最小值沒有影響
        data_stack.pop();
        min_stack.pop();
    }
    
    public int top() {
        // 檢視當前棧的棧頂也是直接peek
        return data_stack.peek();
    }
    
    public int min() {
        // 輔助棧的棧頂元素就是當前棧中的最小的元素
        return min_stack.peek();
    }
}

複雜度分析

  • 時間複雜度:\(O(1)\)
  • 空間複雜度:\(O(N)\)

相關文章