在 JavaScript 中查找所有总和为目标值的对

javascriptweb developmentfront end technologyobject oriented programming更新于 2024/12/5 16:12:17

在给定的问题陈述中,我们的目标是借助 Javascript 查找所有总和为给定目标值的可能对。因此,我们可以借助 Javascript 的一些内置函数来解决这个问题。

理解问题

给定的问题是,我们给出了一个数组和一个目标值,我们的任务是找到所有总和为目标值的可能对。例如,假设我们有一个像 [6, 5, 4, 3, 2, 1] 这样的数组,目标值为 6,因此可能的对将是 [ [ 2, 4 ], [ 1, 5 ] ]。

给定问题的逻辑

我们将首先初始化空白数组以存储满足条件的对。之后,我们将使用 map 对象来跟踪输入数组中的每个数字。然后借助循环迭代数组项。在每次迭代中,我们将通过减去目标值来计算当前数字的补数。如果我们找到了补数,则将其保存在 map 对象中。将所有对添加到结果数组后,我们将更新 map 对象的当前数字频率。并返回对数组,该数组将包含所有可能的配对,其总和等于目标值。

算法

步骤 1:借助空数组,我们将存储总和等于给定目标的对的目标值。

步骤 2:创建一个 map 对象来存储输入数组中每个数字的频率跟踪。

步骤 3:遍历输入数组中的数字。

步骤 4:通过从目标值中减去数字来计算数字的补数。

步骤 5:如果 map 中存在数字的补数,则我们将迭代补数计数并将其添加到对数组中。

步骤 6:更新 map 对象中数字的频率。并将对数组返回到控制台。

示例

// 函数用于从数组中查找给定目标的对
function findPossiblePairs(arr, target) {
   const pairs = [];
   const map = {};
   for (let i = 0; i < arr.length; i++) {
      const complement = target - arr[i];

      if (map.hasOwnProperty(complement)) {
         const compCount = map[complement];

         for (let j = 0; j < compCount; j++) {
            pairs.push([arr[i], complement]);
         }
      }

      if (map.hasOwnProperty(arr[i])) {
         map[arr[i]]++;
      } else {
         map[arr[i]] = 1;
      }
   }

   return pairs;
}
const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const sum = 10;

const pairs = findPossiblePairs(nums, sum);
console.log(pairs);

输出

[ [ 6, 4 ], [ 7, 3 ], [ 8, 2 ], [ 9, 1 ] ]

复杂性

代码执行时间为 O(n),这里 n 是给定输入数组的大小。因为我们对数组进行了一次迭代。并且我们使用对象映射来存储数组中整数的频率计数;空间复杂度为 O(n)。

结论

在线性时间内,我们创建的代码识别出所有可能的总和为所需值的对。我们还使用频率图确定了每个项目或数字的补码并创建了可能的对。无需使用嵌套循环,我们就以最小的时间和空间复杂度实现了所需的输出。


相关文章


有用资源