用栈操作构建数组
难度:
标签:
题目描述
代码结果
运行时间: 23 ms, 内存: 16.0 MB
/* 思路:
* 使用Java Stream API构建操作序列。使用IntStream.rangeClosed生成1到n的数字流,
* 通过collect将流处理为结果列表。如果流中的元素存在于target中,则'Push',
* 否则'Push'后'Pop'。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public List<String> buildArray(int[] target, int n) {
List<Integer> targetList = IntStream.of(target).boxed().collect(Collectors.toList());
return IntStream.rangeClosed(1, n)
.boxed()
.flatMap(i -> {
List<String> operations = new ArrayList<>();
operations.add("Push");
if (!targetList.contains(i)) {
operations.add("Pop");
}
return operations.stream();
})
.collect(Collectors.toList());
}
}
解释
方法:
这个题解通过模拟从1到n的数字读取和根据条件进行Push或Pop操作以构建目标数组target。给定的target是严格递增的,算法从1开始递增地读取数字,对于每个数字,首先执行Push操作将其加入栈(虽然这里没有显式的栈,但可以认为是虚拟的)。接着,检查这个数字是否是目标数组target中当前需要的数字,如果是,则移动目标数组的索引i;如果不是,执行Pop操作以撤销前一步的Push。这个过程持续到处理完所有target中的数字为止。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
题解中提到,如果目标数组已经构建完成,就停止读取更多元素。这里的逻辑是在检测到目标数组的最后一个元素被处理后立即终止循环,还是有其他情况下也会提前终止循环?
▷🦆
如果输入的目标数组target为空,返回的结果是空数组。这种情况下,函数是否还会进入for循环,还是直接在循环开始前就返回了结果?
▷🦆
在处理数字时,首先默认进行'Push'操作,然后再根据条件可能执行'Pop'操作。这种方法是否存在效率上的浪费,比如说对于不需要的数字,是否有更优的处理策略?
▷🦆
题解假设了target数组严格递增并且只包含1到n之间的数字,如果target中包含超出这个范围的数字,或者不是递增的,这个算法还能正确执行吗?
▷