leetcode 946 Validate Stack Sequences
阿新 • • 發佈:2018-12-09
leetcode 946 Validate Stack Sequences
1.題目描述
給定 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 的排列。
2.解題思路
(1)方法1
剛接觸到題目時,使用了一種完全非常規的判斷方法(且相當不經濟) :)
以popped
迴圈遍歷,查詢每一個popped
裡的數字在pushed
中的索引,由棧屬性可知,新彈出的數字是棧頂元素,有三種情況,1.新加入的數字(在pushed
pushed
當前數字中的左側第一位),將left
變數繼續左移到合法位置。3.當前數字左側非第一位數字,因該題目中所有數字都只出現一次,故該情況不合法。
(2)方法2
按照棧的思想,建立一個新的陣列cur
,從pushed
中迴圈遍歷把每個元素加入新的陣列cur
,每次加入新元素都檢查cur
最後一位是否是popped
的第一位元素,若是,在cur
剔除最後一位元素,並把popped
指標向右移動一位,最後檢查popped
是否遍歷完全,即可判斷是否為合法棧順序。
3.Python程式碼
(1)方法1
class Solution:
def validateStackSequences(self, pushed, popped):
"""
:type pushed: List[int]
:type popped: List[int]
:rtype: bool
"""
if pushed==[]:
return True
i=0
curr=pushed.index(popped[i])
left=curr-1
push_rest=pushed[:]
push_rest.remove(popped[i])
while i<len(pushed)-1:
i+=1
push_rest.remove(popped[i])
curr=pushed.index(popped[i])
if curr==left:#說明向左移動
left=left-1
while pushed[left] not in push_rest and left>0:
left=left-1
continue
elif curr>left:#說明向右移動
left=curr-1
while pushed[left] not in push_rest and left>0:
left=left-1
continue
else:#說明不合格
return(False)
return(True)
(2)方法2
class Solution:
def validateStackSequences(self, pushed, popped):
"""
:type pushed: List[int]
:type popped: List[int]
:rtype: bool
"""
cur = []
i = 0
for x in pushed:
cur.append(x)
while cur and cur[-1] == popped[i]:
i += 1
cur.pop()
return (i == len(popped))