返回
用栈模拟构建数组:清晰步骤,轻松理解
后端
2023-12-07 08:24:19
用栈操作构建数组:简单模拟 + 栈思想
从简单的模拟到巧妙的栈思想,用最容易理解的方式解析 LeetCode 1441!
问题
LeetCode 1441 要求你使用栈操作来构建一个数组。给你一个目标数组 target
和一个操作列表 ops
,其中每个操作要么是 Push
,要么是 Pop
。一个 Push
操作将一个整数添加到栈的顶部,而一个 Pop
操作将栈顶部的整数移除。
你的任务是判断是否可以使用 ops
中的操作来构建目标数组 target
。如果可以,返回 true
,否则返回 false
。
模拟解法
一种简单的解法是使用栈和数组来模拟操作。具体步骤如下:
- 初始化一个空栈
stack
和一个空数组result
。 - 遍历
ops
,对于每个操作:- 如果操作是
Push
,将整数压入栈中。 - 如果操作是
Pop
,检查栈是否为空。如果不是,则弹出栈顶元素并将其添加到result
中。
- 如果操作是
- 将
result
与target
进行比较。如果它们相等,返回true
,否则返回false
。
栈思想解法
上述模拟解法虽然简单,但时间复杂度为 O(n^2),其中 n 是 ops
的长度。我们可以使用栈思想来优化解法,将时间复杂度降低到 O(n)。
具体思路如下:
- 初始化一个栈
stack
和一个指针i
指向target
的第一个元素。 - 遍历
ops
,对于每个操作:- 如果操作是
Push
,将整数压入栈中。 - 如果操作是
Pop
,检查栈是否为空。如果不是,则弹出栈顶元素。然后,检查栈顶元素是否等于target[i]
。如果是,则将i
加 1。
- 如果操作是
- 遍历完成后,如果
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:用栈操作构建数组。这道题不仅考查了你的编码能力,还测试了你的问题解决和算法优化技巧。