Leetcode 946:驗證棧序列(超詳細的解法!!!)
阿新 • • 發佈:2018-12-15
給定 pushed
和 popped
兩個序列,只有當它們可能是在最初空棧上進行的推入 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 之前彈出。
提示:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed
是popped
的排列。
解題思路
這個問題非常簡單,模擬題目的入棧出棧操作就可以了。當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
如有問題,希望大家指出!!!