leetcode算法946. 验证栈序列

78 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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)