题目是LeetCode第188场周赛的第一题,链接:1441. 用栈操作构建数组。具体描述为:给你一个目标数组target
和一个整数n
。每次迭代,需要从list = {1,2,3..., n}
中依序读取一个数字。请使用下述操作来构建目标数组target
:
- Push:从
list
中读取一个新元素, 并将其推入数组中。 - Pop:删除数组中的最后一个元素。
- 如果目标数组构建完成,就停止读取更多元素。
题目数据保证目标数组严格递增,并且只包含1
到n
之间的数字。请返回构建目标数组所用的操作序列。题目数据保证答案是唯一的。target
是严格递增的。
示例1:
输入:target = [1,3], n = 3
输出:["Push","Push","Pop","Push"]
解释:
读取 1 并自动推入数组 -> [1]
读取 2 并自动推入数组,然后删除它 -> [1]
读取 3 并自动推入数组 -> [1,3]
示例2:
输入:target = [1,2,3], n = 3
输出:["Push","Push","Push"]
示例3:
输入:target = [1,2], n = 4
输出:["Push","Push"]
解释:只需要读取前 2 个数字就可以停止。
示例4:
输入:target = [2,3,4], n = 4
输出:["Push","Pop","Push","Push","Push"]
题目很简单,因为保证了target
是递增的,假设target
最后一个数为n
,正常没有Pop
的话数组的元素就是从1
一直到n
,有哪个数缺失了的话就说明需要有一个额外的Pop
,不然一个Push
就够了。时间复杂度为
O
(
n
)
O(n)
O(n),空间复杂度为
O
(
1
)
O(1)
O(1)。
JAVA版代码如下:
class Solution {
public List<String> buildArray(int[] target, int n) {
List<String> result = new LinkedList<>();
int count = 1;
for (int i = 0; i < target.length; ++i) {
if (target[i] == count) {
++count;
result.add("Push");
}
else {
while (count < target[i]) {
result.add("Push");
result.add("Pop");
++count;
}
result.add("Push");
++count;
}
}
return result;
}
}
提交结果如下:
Python版代码如下:
class Solution:
def buildArray(self, target: List[int], n: int) -> List[str]:
result = []
count = 1
for i in target:
if i == count:
result.append("Push")
else:
while count < i:
count += 1
result.append("Push")
result.append("Pop")
result.append("Push")
count += 1
return result
提交结果如下: