加载中...
946-验证栈序列(Validate Stack Sequences)
发表于:2021-12-03 | 分类: 中等
字数统计: 714 | 阅读时长: 3分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/validate-stack-sequences

英文原文

Given two integer arrays pushed and popped each with distinct values, return true if this could have been the result of a sequence of push and pop operations on an initially empty stack, or false otherwise.

 

Example 1:

Input: pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
Output: true
Explanation: We might do the following sequence:
push(1), push(2), push(3), push(4),
pop() -> 4,
push(5),
pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

Example 2:

Input: pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
Output: false
Explanation: 1 cannot be popped before 2.

 

Constraints:

  • 1 <= pushed.length <= 1000
  • 0 <= pushed[i] <= 1000
  • All the elements of pushed are unique.
  • popped.length == pushed.length
  • popped is a permutation of pushed.

中文题目

给定 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 之前弹出。

 

提示:

  • 1 <= pushed.length <= 1000
  • 0 <= pushed[i] <= 1000
  • pushed 的所有元素 互不相同
  • popped.length == pushed.length
  • poppedpushed 的一个排列

通过代码

官方题解

方法一: 贪心

思路

所有的元素一定是按顺序 push 进去的,重要的是怎么 pop 出来?

假设当前栈顶元素值为 2,同时对应的 popped 序列中下一个要 pop 的值也为 2,那就必须立刻把这个值 pop 出来。因为之后的 push 都会让栈顶元素变成不同于 2 的其他值,这样再 pop 出来的数 popped 序列就不对应了。

算法

pushed 队列中的每个数都 push 到栈中,同时检查这个数是不是 popped 序列中下一个要 pop 的值,如果是就把它 pop 出来。

最后,检查不是所有的该 pop 出来的值都是 pop 出来了。

[solution1-Java]
class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { int N = pushed.length; Stack<Integer> stack = new Stack(); int j = 0; for (int x: pushed) { stack.push(x); while (!stack.isEmpty() && j < N && stack.peek() == popped[j]) { stack.pop(); j++; } } return j == N; } }
[solution1-Python]
class Solution(object): def validateStackSequences(self, pushed, popped): j = 0 stack = [] for x in pushed: stack.append(x) while stack and j < len(popped) and stack[-1] == popped[j]: stack.pop() j += 1 return j == len(popped)

算法复杂度

  • 时间复杂度:$O(N)$,其中 $N$ 是 pushed 序列和 popped 序列的长度。

  • 空间复杂度:$O(N)$。

统计信息

通过次数 提交次数 AC比率
28729 45810 62.7%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
945-使数组唯一的最小增量(Minimum Increment to Make Array Unique)
下一篇:
947-移除最多的同行或同列石头(Most Stones Removed with Same Row or Column)
本文目录
本文目录