返回

用栈模拟构建数组:清晰步骤,轻松理解

后端

用栈操作构建数组:简单模拟 + 栈思想

从简单的模拟到巧妙的栈思想,用最容易理解的方式解析 LeetCode 1441!

问题

LeetCode 1441 要求你使用栈操作来构建一个数组。给你一个目标数组 target 和一个操作列表 ops,其中每个操作要么是 Push,要么是 Pop。一个 Push 操作将一个整数添加到栈的顶部,而一个 Pop 操作将栈顶部的整数移除。

你的任务是判断是否可以使用 ops 中的操作来构建目标数组 target。如果可以,返回 true,否则返回 false

模拟解法

一种简单的解法是使用栈和数组来模拟操作。具体步骤如下:

  1. 初始化一个空栈 stack 和一个空数组 result
  2. 遍历 ops,对于每个操作:
    • 如果操作是 Push,将整数压入栈中。
    • 如果操作是 Pop,检查栈是否为空。如果不是,则弹出栈顶元素并将其添加到 result 中。
  3. resulttarget 进行比较。如果它们相等,返回 true,否则返回 false

栈思想解法

上述模拟解法虽然简单,但时间复杂度为 O(n^2),其中 n 是 ops 的长度。我们可以使用栈思想来优化解法,将时间复杂度降低到 O(n)。

具体思路如下:

  1. 初始化一个栈 stack 和一个指针 i 指向 target 的第一个元素。
  2. 遍历 ops,对于每个操作:
    • 如果操作是 Push,将整数压入栈中。
    • 如果操作是 Pop,检查栈是否为空。如果不是,则弹出栈顶元素。然后,检查栈顶元素是否等于 target[i]。如果是,则将 i 加 1。
  3. 遍历完成后,如果 i 等于 target 的长度,返回 true,否则返回 false

代码示例

def buildArray(target, ops):
    stack = []
    i = 0

    for op in ops:
        if op == "Push":
            stack.append(i + 1)
            i += 1
        elif op == "Pop":
            if not stack:
                return False
            stack.pop()
            i += 1

    return stack == target

总结

通过使用栈模拟和栈思想,我们可以高效地解决 LeetCode 1441:用栈操作构建数组。这道题不仅考查了你的编码能力,还测试了你的问题解决和算法优化技巧。