原文链接: 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 ofpushed
.
中文题目
给定 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
popped
是pushed
的一个排列
通过代码
官方题解
方法一: 贪心
思路
所有的元素一定是按顺序 push
进去的,重要的是怎么 pop
出来?
假设当前栈顶元素值为 2
,同时对应的 popped
序列中下一个要 pop
的值也为 2
,那就必须立刻把这个值 pop
出来。因为之后的 push
都会让栈顶元素变成不同于 2
的其他值,这样再 pop
出来的数 popped
序列就不对应了。
算法
将 pushed
队列中的每个数都 push
到栈中,同时检查这个数是不是 popped
序列中下一个要 pop
的值,如果是就把它 pop
出来。
最后,检查不是所有的该 pop
出来的值都是 pop
出来了。
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;
}
}
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% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|