JavaScript 程序查找是否存在和为 0 的子数组


作为开发者,我们经常被要求查找数组中是否存在和为 0 的子数组。这可以通过使用前缀和的概念来实现。我们将跟踪迄今为止看到的子数组元素的和,并将其存储在哈希映射中。如果之前已经看到过该和,则表示存在具有该和的子数组,并且和为 0。我们将持续更新哈希映射,其中存储迄今为止看到的元素的和。这样,我们就可以确定数组中是否存在和为 0 的子数组。

方法

  • 将变量“sum”初始化为 0,并将“hash_map”对象初始化为存储和值作为键,其索引作为值。

  • 遍历给定的数组,对于每个元素 -

    • 将当前元素添加到和中。

    • 如果当前和为 0 或已存在于 hash_map 中,则返回 true,因为存在和为 0 的子数组。

    • 否则,将和值及其索引插入到 hash_map 中。

  • 如果循环完成,则返回 false,因为不存在和为 0 的子数组。

  • hash_map 有助于跟踪累积和并确定是否存在任何重复的和。

  • 如果找到重复的和,则表示这两个和之间存在一个子数组,其和为 0。

  • 此方法的时间复杂度为 O(n),其中 n 是给定数组中元素的数量。

示例

这是一个查找数组中是否存在和为 0 的子数组的 JavaScript 程序的完整示例 -

function hasZeroSum(arr) {
   let sum = 0;
   let set = new Set();
     
   for (let i = 0; i < arr.length; i++) {
      sum += arr[i];
      if (set.has(sum)) return true;
      set.add(sum);
   }
    
   return false;
}
const arr = [4, 2, -3, 1, 6];
console.log(hasZeroSum(arr));

解释

  • 函数hasZeroSum 以数组arr作为参数。

  • 我们初始化两个变量sumsetsum变量用于跟踪子数组中元素的当前和,set用于存储之前看到的和。

  • 然后我们使用for循环遍历数组的元素。

  • 在每次迭代中,我们将当前元素添加到sum中,并检查set是否已包含sum的值。

  • 如果sum的值已在set中,则表示从该和第一次出现开始到当前元素结束的子数组的和为 0,因此我们返回true

  • 如果sum的值不在set中,则将其添加到set中。

  • 如果我们遍历了整个数组并且没有返回true,则表示不存在和为 0 的子数组,因此我们返回false

  • 最后,我们使用示例数组测试该函数并将结果记录到控制台。

更新于: 2023年3月15日

419 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.