算法题:剑指 Offer 31. 栈的压入、弹出序列(题目+思路+代码+注释)快速幂解法 时空 1ms击败97%用户

在这里插入图片描述

一次AC的快乐

题目

剑指 Offer 31. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

示例 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 之前弹出。

提示:

0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed 是 popped 的排列。
注意:本题与主站 946 题相同:https://leetcode-cn.com/problems/validate-stack-sequences/

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

  • 第一种思路,暴力穷举,备用之选,暂不考虑。
  • 第二种思路,观察出入栈,找出办法来校验。
    我们可以看示范例子想一下,pushed = [1,2,3,4,5],popped = [4,5,3,2,1],假设现在有个栈来存,然后第一个数组是可以用来往里面添加数的,第二个数组是需要弹出的。那我们最终目标是弹出第二个数组所有的,从弹出第一个(popped数组)开始,需要弹出4,我们去看当前栈的栈顶有没有4,有就正好弹出,没有那就压入一个,再继续尝试,直到弹出所有。我们可以发现这样来检测复杂度是很低的,只需要遍历一次即可完成。另外题目中写到了数组长度可以为0,那做一个提前判断,一旦为0返回true。因此写完代码检查后没问题,然后提交,秒了这个中等算法题。

代码


import java.util.Stack;

/**
 * @author humorchen
 * @date 2021/11/10 10:20
 */
public class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        if (pushed.length == 0){
            return true;
        }
        Stack<Integer> stack = new Stack<>();
        int pushedIndex = 0,pushedSize = pushed.length, poppedIndex = 0,poppedSize = popped.length;
        while (poppedIndex < poppedSize){
            int popItem = popped[poppedIndex];
            //弹出一个来
            if (stack.size() > 0 && stack.peek() == popItem){
                //是对的就弹出
                int p = stack.pop();
//                System.out.println("弹出 "+p);
                poppedIndex++;
                continue;
            }
            //需要压入栈一个
            if (pushedIndex < pushedSize){
                //压栈后继续循环执行
                stack.push(pushed[pushedIndex++]);
//                System.out.println("压入 "+stack.peek());
            }else {
                //没有了
//                System.out.println("找不到 "+popItem+" 返回失败");
                return false;
            }
        }
//        System.out.println("返回成功");
        return true;
    }

    public static void main(String[] args) {
        int[] pushed = {1,2,3,4,5};
        int[] popped = {4,5,3,2,1};
        System.out.println(new Solution().validateStackSequences(pushed,popped));
    }
}


posted @ 2021-11-10 11:02  HumorChen99  阅读(8)  评论(0编辑  收藏  举报  来源