动态编程 - 元素和 JavaScript 部分
在此问题陈述中,我们的任务是计算数组中所有元素的总和,并在每一步中删除一个元素,并显示所有可能子数组的总和的结果数组。并在 Javascript 功能的帮助下实现此问题。
给定问题的逻辑
给定的问题表明我们必须在每一步计算除一个元素之外的每个元素的总和。为了解决给定的问题,我们将定义一个数组作为输入,并通过在每次迭代中扣除一个元素来返回元素和数组的输出。
我们将使用 for 循环迭代数组的项目,并使用与之前相同的方法通过消除当前元素来计算总和。然后将这些总和添加到新的结果数组中。在每个阶段,当前元素都将被更改。
算法
步骤 1 - 在程序开始时,声明一个整数数组,该数组将用于计算每一步除一个元素之外的所有元素的总和。在我们的代码中,如果数组中有 5 个元素,那么我们将计算 4 个元素的总和。
步骤 2 - 如果 n 是数组中存在的项目数,我们必须将 n-1 个项目的总和存储在数组中。因此,为了存储总和,我们将创建一个总和数组。
步骤 3 - 在 Javascript 中,我们有一个名为 reduce 的方法,用于通过逐个迭代元素来更新数组的所有值。因此,我们还将使用 Reduce 方法来获取所有元素的总和。
步骤 4 - 获得总和后,将总和推送到结果变量中。
步骤 5 - 现在启动 for 循环并运行直到数组的长度。
步骤 6 - 在此阶段,我们将从数组中切出一个元素以获取 n-1 个项目的总和。
步骤 7 - 在最后一步,将所有结果总和推送到结果数组中并在控制台上获取输出。
算法代码
// 用于计算部分总和的数组 const arr = [1, 2, 3, 4, 5]; // 结果数组 const sumArray = (arr = []) => arr.reduce((a, b) => a + b, 0); const sumWithoutOne = (arr = []) => { const result = [sumArray(arr)]; for (let i = 0; i < arr.length; i++) { const sum = sumArray(arr.slice(0, i).concat(arr.slice(i + 1))); result.push(sum); } return result; }; console.log(sumWithoutOne(arr));
复杂性
我们可以在代码中看到,我们使用了 Reduce 方法,执行该方法需要 O(n) 的时间。另一个函数 sumWithoutOne 使用 for 循环和切片方法,该方法也需要 O(n) 的时间,但切片方法被调用了 n 次,因为它在 for 循环中,所以总的时间复杂度为 O(n^2)。空间复杂度为 O(n),其中 n 是新数组中的和数。
总结
我们已经在上面的算法中看到了如何获取数组某些部分的总和。如果一个数组有 n 个元素,我们通过从数组中每一步删除一个元素并创建一个保存 n-1 个项的总和的新数组来计算 n-1 个元素的总和。因此,此代码的时间复杂度为 O(n^2),空间复杂度为 O(n)。