leetcode
leetcode 1301 ~ 1350
用栈操作构建数组

用栈操作构建数组

难度:

标签:

题目描述

代码结果

运行时间: 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)

代码细节讲解

🦆
题解中提到,如果目标数组已经构建完成,就停止读取更多元素。这里的逻辑是在检测到目标数组的最后一个元素被处理后立即终止循环,还是有其他情况下也会提前终止循环?
在题解中,循环会在检测到目标数组的最后一个元素被成功处理后立即终止。这是因为一旦目标数组的所有元素都已经按顺序被加入(对应每个'Push'操作后的检查),就不再需要继续读取更多的数字或进行更多的操作。既然目标数组已完全构建,继续执行循环没有必要,因此会用`if i >= len(target): break`这行代码来检查是否所有目标元素都已处理,并据此终止循环。没有其他情况会导致提前终止,除非外部中断或异常。
🦆
如果输入的目标数组target为空,返回的结果是空数组。这种情况下,函数是否还会进入for循环,还是直接在循环开始前就返回了结果?
如果输入的目标数组target为空,函数在进入for循环之前就会直接返回空数组。这是因为在for循环开始之前,代码中有一个检查:`if not target: return []`。这行代码会在target为空时立即返回空数组,因此for循环不会被执行。这种设计避免了不必要的迭代,提高了函数的效率。
🦆
在处理数字时,首先默认进行'Push'操作,然后再根据条件可能执行'Pop'操作。这种方法是否存在效率上的浪费,比如说对于不需要的数字,是否有更优的处理策略?
这种首先进行'Push'然后可能执行'Pop'的策略确实在某些情况下可能导致效率上的浪费,尤其是当存在许多不需要的数字时。更优的策略可以包括先检查当前数字是否是目标数组中需要的,如果不是,则根本不执行'Push'操作,从而避免不必要的'Push'和随后的'Pop'。这样可以减少操作的次数,提高代码的执行效率。然而,这需要修改现有的算法逻辑,可能会使代码的逻辑复杂度略有增加。
🦆
题解假设了target数组严格递增并且只包含1到n之间的数字,如果target中包含超出这个范围的数字,或者不是递增的,这个算法还能正确执行吗?
当前的算法假设target数组是严格递增的并且所有元素都在1到n的范围内。如果target数组包含超出这个范围的数字或者数字不是递增的,现有算法将无法正确执行。例如,如果target包含比n大的数字,这些数字永远不会被读取,因此无法正确构建目标数组。如果数组不是递增的,给定的算法也无法处理,因为它依赖于递增顺序来逐步构建数组。在这种情况下,需要重新设计算法,以适应更广泛的输入情况。

相关问题