LeetCode 剑指 Offer 31. 栈的压入、弹出序列

题目描述

剑指 Offer 31. 栈的压入、弹出序列

image-20241107205614060

思路分析

解法一:栈模拟(推荐)

核心思路

  • pushed 顺序入栈。
  • 每次入栈后,尽可能弹出与 popped 当前指针相等的元素。
  • 最终若栈为空且 popped 全部匹配,则序列合法。


复杂度分析

  • 时间复杂度:O(n),其中 n 表示序列长度。
  • 空间复杂度:O(n)。
// 栈模拟压入与弹出
class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Deque<Integer> stack = new ArrayDeque<>();
        int j = 0;

        for (int x : pushed) {
            stack.push(x);
            while (!stack.isEmpty() && j < popped.length && stack.peek() == popped[j]) {
                stack.pop();
                j++;
            }
        }

        return stack.isEmpty();
    }
}
// 栈模拟压入与弹出
func validateStackSequences(pushed []int, popped []int) bool {
	stack := make([]int, 0, len(pushed))
	j := 0

	for _, x := range pushed {
		stack = append(stack, x)
		for len(stack) > 0 && j < len(popped) && stack[len(stack)-1] == popped[j] {
			stack = stack[:len(stack)-1]
			j++
		}
	}

	return len(stack) == 0
}

相似题目

题目 难度 考察点
946. 验证栈序列 中等
20. 有效的括号 简单
155. 最小栈 简单
225. 用队列实现栈 简单
232. 用栈实现队列 简单
735. 小行星碰撞 中等
本文作者:
本文链接: https://hgnulb.github.io/blog/2024/44422782
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!