1441-用栈操作构建数组

Raphael Liu Lv10

给你一个数组 target 和一个整数 n。每次迭代,需要从 list = { 1 , 2 , 3 ..., n } 中依次读取一个数字。

请使用下述操作来构建目标数组 target

  • "Push":从 list 中读取一个新元素, 并将其推入数组中。
  • "Pop":删除数组中的最后一个元素。
  • 如果目标数组构建完成,就停止读取更多元素。

题目数据保证目标数组严格递增,并且只包含 1n 之间的数字。

请返回构建目标数组所用的操作序列。如果存在多个可行方案,返回任一即可。

示例 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 个数字就可以停止。

提示:

  • 1 <= target.length <= 100
  • 1 <= n <= 100
  • 1 <= target[i] <= n
  • target 严格递增

方法一:模拟

思路

操作的对象是 1 到 n 按顺序排列的数字,每次操作一个数字时,如果它在 target 中,则只需要将它 Push 入栈即可。如果不在 target 中,可以先将其 Push 入栈,紧接着 Pop 出栈。因为 target 中数字是严格递增的,因此只要遍历 target,在 target 中每两个连续的数字 prev 和 number 中插入 number} - \textit{prev} - 1 个 Push 和 Pop,再多加一个 Push 来插入当前数字即可。

代码

[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def buildArray(self, target: List[int], n: int) -> List[str]:
res = []
prev = 0
for number in target:
for _ in range(number - prev - 1):
res.append('Push')
res.append('Pop')
res.append('Push')
prev = number
return res
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public List<String> buildArray(int[] target, int n) {
List<String> res = new ArrayList<String>();
int prev = 0;
for (int number : target) {
for (int i = 0; i < number - prev - 1; i++) {
res.add("Push");
res.add("Pop");
}
res.add("Push");
prev = number;
}
return res;
}
}
[sol1-C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Solution {
public IList<string> BuildArray(int[] target, int n) {
IList<string> res = new List<string>();
int prev = 0;
foreach (int number in target) {
for (int i = 0; i < number - prev - 1; i++) {
res.Add("Push");
res.Add("Pop");
}
res.Add("Push");
prev = number;
}
return res;
}
}
[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
vector<string> buildArray(vector<int>& target, int n) {
vector<string> res;
int prev = 0;
for (int number : target) {
for (int i = 0; i < number - prev - 1; i++) {
res.emplace_back("Push");
res.emplace_back("Pop");
}
res.emplace_back("Push");
prev = number;
}
return res;
}
};
[sol1-C]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char ** buildArray(int* target, int targetSize, int n, int* returnSize) {
char **res = (char **)malloc(sizeof(char *) * n * 2);
int prev = 0, pos = 0;
for (int j = 0; j < targetSize; j++) {
for (int i = 0; i < target[j] - prev - 1; i++) {
res[pos] = (char *)malloc(sizeof(char) * 8);
strcpy(res[pos++], "Push");
res[pos] = (char *)malloc(sizeof(char) * 8);
strcpy(res[pos++], "Pop");
}
res[pos] = (char *)malloc(sizeof(char) * 8);
strcpy(res[pos++], "Push");
prev = target[j];
}
*returnSize = pos;
return res;
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
9
10
11
12
13
var buildArray = function(target, n) {
const res = [];
let prev = 0;
for (const number of target) {
for (let i = 0; i < number - prev - 1; i++) {
res.push("Push");
res.push("Pop");
}
res.push("Push");
prev = number;
}
return res;
};
[sol1-Golang]
1
2
3
4
5
6
7
8
9
10
11
func buildArray(target []int, n int) (ans []string) {
prev := 0
for _, number := range target {
for i := 0; i < number-prev-1; i++ {
ans = append(ans, "Push", "Pop")
}
ans = append(ans, "Push")
prev = number
}
return
}

复杂度分析

  • 时间复杂度:O(n)。Push 需要添加 O(n) 次。

  • 空间复杂度:O(1)。除了保存结果的数组,其他只消耗常数空间。

 Comments
On this page
1441-用栈操作构建数组