当前位置:实例文章 » 其他实例» [文章](栈队列堆) 剑指 Offer 31. 栈的压入、弹出序列 ——【Leetcode每日一题】

(栈队列堆) 剑指 Offer 31. 栈的压入、弹出序列 ——【Leetcode每日一题】

发布人:shili8 发布时间:2025-02-07 18:54 阅读次数:0

**剑指 Offer31. 栈的压入、弹出序列**

**问题描述**

给定一个整数序列,请判断该序列是否为栈的压入、弹出序列。假设每次压入或弹出的操作都是推送到栈顶,或者从栈顶弹出。

**示例1**

输入:`[2,1,3]`
输出:`true`

**示例2**

输入:`[4,5,3,24,12,2]`
输出:`false`

**示例3**

输入:`[5,4,3,2,1]`
输出:`true`

**示例4**

输入:`[1,2,3,4,5]`
输出:`true`

**示例5**

输入:`[5,4,3,2,1,6]`
输出:`false`

**解决方案**

我们可以使用一个栈来模拟压入和弹出操作。每次遇到一个数字,我们都将其压入栈中。如果当前栈顶元素与下一个预期的栈顶元素相同,则我们可以弹出栈顶元素,直到栈为空或栈顶元素不再匹配。

class Solution:
 def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
 stack = []
 j =0 for i in range(len(pushed)):
 stack.append(pushed[i])
 while stack and stack[-1] == popped[j]:
 stack.pop()
 j +=1 return not stack


**代码注释**

* 我们首先初始化一个空栈 `stack` 和一个索引 `j` 来跟踪弹出序列中的当前元素。
* 然后,我们遍历压入序列中的每个数字,并将其压入栈中。
* 每次遇到一个数字时,我们尝试匹配它与下一个预期的栈顶元素。如果它们相等,我们可以弹出栈顶元素,直到栈为空或栈顶元素不再匹配。
* 最后,我们检查栈是否为空。如果栈为空,则意味着压入和弹出序列是匹配的,因此我们返回 `True`。否则,我们返回 `False`。

**时间复杂度**

该算法的时间复杂度为 O(n),其中 n 是压入序列中的数字数量。每个数字都被推送到栈中一次,弹出栈顶元素也只发生在匹配时,因此总共进行了 O(n) 次操作。

**空间复杂度**

该算法的空间复杂度为 O(n),其中 n 是压入序列中的数字数量。我们使用一个栈来存储每个数字,最大可能大小是压入序列中数字的数量。

其他信息

其他资源

Top