0%

『LeetCode』1441 用栈操作构建数组

题目

1441. 用栈操作构建数组

给你一个数组 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 严格递增

标签

栈, 数组, 模拟


题解

【用栈操作构建数组】简单模拟

模拟

题目其实和栈没有很大关系,直接模拟即可:遍历 target 并从序列中迭代取值,取得的值是 target 中的值就继续查找下一个,否则就删掉

1
2
3
4
5
6
7
8
9
10
11
12
# Code language: Python
class Solution:
def buildArray(self, target: List[int], n: int) -> List[str]:
ans, i, j, m = list(), 0, 1, len(target)
while i < m:
ans.append("Push")
if j == target[i]:
i += 1
else:
ans.append("Pop")
j += 1
return ans
1
2
3
4
5
6
7
8
9
10
11
12
// Code language: Java
class Solution {
public List<String> buildArray(int[] target, int n) {
List<String> ans = new ArrayList<>();
for (int i = 0, j = 1, m = target.length; i < m; ++j) {
ans.add("Push");
if (j != target[i]) ans.add("Pop");
else ++i;
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Code language: C++
class Solution {
public:
vector<string> buildArray(vector<int>& target, int n) {
vector<string> ans;
for (int i = 0, cur = 1, n = target.size(); i < n; ++i) {
while (cur++ != target[i]) {
ans.emplace_back("Push");
ans.emplace_back("Pop");
}
ans.emplace_back("Push");
}
return ans;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Code language: JavaScript */
/**
* @param {number[]} target
* @param {number} n
* @return {string[]}
*/
var buildArray = function(target, n) {
const ans = new Array();
for (let i = 0, j = 1, m = target.length; i < m; ++j) {
ans.push("Push");
if (j == target[i]) ++i;
else ans.push("Pop");
}
return ans;
};
1
2
3
4
5
6
7
8
9
10
11
12
/* Code language: Golang */
func buildArray(target []int, n int) (ans []string) {
for i, j, m := 0, 1, len(target); i < m; j++ {
ans = append(ans, "Push")
if j == target[i] {
i++
} else {
ans = append(ans, "Pop")
}
}
return
}
  • 时间复杂度: \(O(n)\)
  • 空间复杂度: \(O(1)\)

如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客Algorithm - Github 查看更多题解

--- ♥ end ♥ ---

欢迎关注我呀~