1. 程式人生 > >leetcode 946 Validate Stack Sequences

leetcode 946 Validate Stack Sequences

leetcode 946 Validate Stack Sequences

1.題目描述

給定 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 之前彈出。

提示:

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

2.解題思路

(1)方法1

剛接觸到題目時,使用了一種完全非常規的判斷方法(且相當不經濟) :)
popped迴圈遍歷,查詢每一個popped裡的數字在pushed中的索引,由棧屬性可知,新彈出的數字是棧頂元素,有三種情況,1.新加入的數字(在pushed

當前數字中的右側),此時儲存改變後的左側第一位數字,同時考慮到該數字是否已經彈出。2.當前數字的左側第一位數字(在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))