Description

給定兩個整數陣列 pushedpopped,兩者皆為 1n 的排列。判斷這組 push/pop 序列是否為合法的堆疊操作序列。

Example:

Input: pushed = [1,2,3,4,5], popped = [4,5,3,2,1] Output: true

Intuition#

核心思路:模擬堆疊操作,依序 push 元素,每次 push 後持續檢查棧頂是否與 popped 序列的下一個元素相同,若是則 pop。

  • 貪心策略:能 pop 就立刻 pop,因為延遲 pop 不會帶來更好的結果
  • 如果模擬結束後堆疊為空,代表序列合法

Approaches#

⭐1: 堆疊模擬(貪心)#

  • 概念: 用一個堆疊模擬操作,遍歷 pushed 陣列依序壓入,每次壓入後用 while 迴圈盡可能 pop,最後檢查堆疊是否為空
  • 時間複雜度: O(n) - 每個元素最多入棧出棧各一次
  • 空間複雜度: O(n) - 堆疊最多存 n 個元素
class Solution {
    fun validateStackSequences(pushed: IntArray, popped: IntArray): Boolean {
        val stack = ArrayDeque<Int>()
        var j = 0

        for (x in pushed) {
            stack.addLast(x)
            while (stack.isNotEmpty() && stack.last() == popped[j]) {
                stack.removeLast()
                j++
            }
        }

        return stack.isEmpty()
    }
}

🔑 Takeaways#

  • Pattern: 驗證操作序列合法性的題目,直接模擬是最直覺的方法
  • 關鍵技巧: 貪心地「能 pop 就 pop」是正確策略。用指標 j 追蹤 popped 陣列的進度,避免額外空間