[LeetCode](面試題31)棧的壓入、彈出序列

題目

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如,序列 {1,2,3,4,5} 是某棧的壓棧序列,序列 {4,5,3,2,1} 是該壓棧序列對應的一個彈出序列,但 {4,3,5,1,2} 就不可能是該壓棧序列的彈出序列。

示例 1:

輸入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
輸出:true
解釋:我們可以按以下順序執行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

示例 2:

輸入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
輸出:false
解釋:1 不能在 2 之前彈出。

提示:

  • 0 <= pushed.length == popped.length <= 1000
  • 0 <= pushed[i], popped[i] < 1000
  • pushedpopped 的排列。

解題思路

既然是判斷棧的入棧、出棧順序是否合法,那麼直接用棧模擬即可。
步驟:
1)初始化: 輔助棧 stack ,彈出序列的索引 j ;
2)遍歷壓棧序列元素:
2.1)元素入棧;
2.2)循環出棧:若 stack非空,且棧頂元素 == 彈出序列元素 popped[j] ,則執行出棧操作與 j++;
3)返回值: 遍歷完畢之後,若 stack 爲空,則此彈出序列合法。

複雜度分析:
時間複雜度 O(N) : 其中 N 爲列表 pushed 的長度;每個元素最多入棧與出棧一次,即最多共 2N次出入棧操作。
空間複雜度 O(N) : 輔助棧 stack 最多同時存儲 N 個元素。

代碼

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Deque<Integer> stack = new ArrayDeque<>();
        int n = pushed.length;
        int j = 0; // popped數組索引
        for(int i=0; i<n; i++){
            stack.addLast(pushed[i]);
            while(!stack.isEmpty() && stack.peekLast() == popped[j]){
                stack.removeLast();
                j++;
            }
        }
        return stack.isEmpty();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章