1. 程式人生 > >Leetcode 946:驗證棧序列(超詳細的解法!!!)

Leetcode 946:驗證棧序列(超詳細的解法!!!)

給定 pushedpopped 兩個序列,只有當它們可能是在最初空棧上進行的推入 push 和彈出 pop 操作序列的結果時,返回 true;否則,返回 false

示例 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 之前彈出。 

提示:

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

解題思路

這個問題非常簡單,模擬題目的入棧出棧操作就可以了。當pushed不為空的時候,我們彈出pushed的第一個元素加入到tmp

我們發現此時的tmp最後一個元素和popped

中的第一個元素不一樣

我們繼續壓入pushed中的元素。

我們發現此時tmp[-1]==popped[0],所以我們進行彈出操作,分別彈出兩個相同的元素。

我們發現此時的元素又不相同了,我們再次壓入pushed中的第一個元素。

接著就是一系列的彈出操作。我們最後只要判斷tmp中的元素是不是空即可確定棧順序是不是合理。

class Solution:
    def validateStackSequences(self, pushed, popped):
        """
        :type pushed: List[int]
        :type popped: List[int]
        :rtype: bool
        """
tmp = list() while pushed: p = pushed.pop(0) tmp.append(p) while tmp and popped[0] == tmp[-1]: popped.pop(0) tmp.pop() return not tmp

我將該問題的其他語言版本新增到了我的GitHub Leetcode

如有問題,希望大家指出!!!