【问题标题】:Equal sum subsequence in 2 arrays2个数组中的相等和子序列
【发布时间】:2021-10-14 01:23:27
【问题描述】:

给定 2 个数组 A 和 B,从 A 中选择子序列 X,从 B 中选择 Y,sum(X) 应该等于 sum(Y)。我们必须找到可以选择这种类型子序列的方法的数量。

数组中的元素个数最多为 100 数组中的值 -100 到 100

我的方法:生成两个数组的所有子序列,取它们的总和,对于每个可能的总和,将我们在数组 A 中找到的子序列的数量与我们在数组 B 中找到的具有该总和的子序列的数量相乘。

这是非常低效的,因为生成所有子序列将是 O(2^100)

谁能帮我解决这个问题?我不需要代码,算法的想法会很有帮助。

【问题讨论】:

  • 子序列的数量在2^100的数量级。那是真实的。不是 O(2^100)。 O(2^100) 并不代表你认为的那样。

标签: algorithm subsequence


【解决方案1】:

注意 sum(X) 或 sum(Y) 的范围是 -10000 到 10000
因此,如果它们存储在长度为 20001 的数组中,我们可以跟踪所有值
我们可以循环其中一个数组中的每个元素并跟踪总和计数数组并重复另一个数组。

对于每个元素,我们要么将元素添加到总和中,要么不将元素添加到总和中。

  1. 如果我们添加元素,sum count 数组将移动元素的值。
  2. 如果我们不添加元素,sum count 数组将保持不变。
// let the sum count array be named num and has length 20001 (all filled with 0)
vector<int> num(20001, 0);
// the following line set count of sum = 0 to 1 (position 10001(one based) in the array, As I shift all value by 10000 to handle negative sums)
num[10000] = 1;
for (int i = 0; i < 100; ++i) {
    vector<int> num2(num); // copy num to num2 (Done (2.))
    for (int j = 0; j < 20001; ++j) {
        if (j + A[i] >= 0 && j + A[i] < 20001)
            // Add (1.)
            num2[j + A[i]] += num[j];
    }
    // c++ optimization, we just want num to become num2 and we can destroy num2
    num = num2.move(); 
}

如果我们将 (1.) 和 (2.) 中的数组相加,它将是新的 sum count 数组,为下一个要插入的元素做好准备。每个元素的复杂度为 O(20001)
生成总和计数数组的总体复杂度约为 O(2 * 20001 * 100)。
额外的 O(20001) 以获得最终答案。
所以总体复杂度是 O(2 * 20001 * 100 + 20001)

【讨论】:

  • 对于每个元素,我们要么将元素添加到总和中,要么不将元素添加到总和中。这不是 O(2^n)。能举个例子吗?
  • @NehaK 这样一来,对于 (1.),它需要 O(20000),对于 (2.) 也是如此。您只需要遍历 20000 的数组并将数组中的计数移动到适当的数量。我稍后会在答案中添加代码。
  • 感谢您的帮助。我会等。假设子序列是 1 1 2,按照你的逻辑,我们会有 sum(3)=2?因为我们有 2 (1,2) 个子序列,总和 = 3
  • @NehaK 是的,我们将有 sum[3] = 2 (但不在我的代码中,因为我通过移动数组位置来处理负数)。我添加了代码示例,以便您理解我的意思。希望你懂 c++ :)
  • @NehaK 如果 A 为 1、1、2,num 数组将存储以下内容,num[0] = 1(空子序列),num[1] = 2(2 种方式) , num[2] = 2, num[3] = 2, num[4] = 1, 您可能需要处理一个空子序列,该子序列始终作为结果生成。 (最后只需要num[0]--修复即可)
猜你喜欢
  • 2014-07-26
  • 1970-01-01
  • 2020-09-13
  • 2018-09-22
  • 1970-01-01
  • 2012-11-29
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多