开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情
一、题目描述:
946. 验证栈序列 - 力扣(LeetCode) (leetcode-cn.com)
给定 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 的一个排列
二、思路分析:
放入栈的每一个元素是如何出去的呢?
以第一个为例,假如我第一个进去,但是我也可能第一个出去,怎么判断呢?
就是每个栈中的元素都与pop栈中的top相比(这个top是指第一个输出的元素,若有元素相同那么top++),如果push栈中的元素与pop栈中的top元素不一致,那么将push栈中的元素放入,辅助栈。
这时若辅助栈的元素不为空,那么就要用辅助栈的元素为下一个比较的元素,进行如下操作。依次循环。
三、AC 代码:
bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
if(pushedSize == 0 || pushedSize == 1)
{
return true;
}
int top = -1, top1 = 0;
int *stack = (int *)malloc(sizeof(int)*pushedSize);
for(int i = 0; i < pushedSize; i++)
{
stack[++top] = pushed[i];
while(top != -1 && popped[top1] == stack[top])
{
top--;
top1++;
}
}
if(top == -1)
return true;
return false;
}
四、总结:
除了辅助栈,这道题目的经典解法就是贪心了,贪心如果不熟悉的话,可以看看题解区,官方答案还有很多大佬的都讲的很清晰。
范文参考:
验证栈序列 - 验证栈序列 - 力扣(LeetCode) (leetcode-cn.com)
946 简单方法,栈实现,有点类似单调栈。 - 验证栈序列 - 力扣(LeetCode) (leetcode-cn.com)