给定两个数组A和B,从A中选择一个子序列X,从B中选择Y,求和(X)应等于求和(Y)。我们必须找到选择这类子序列的方法。
数组中的元素数最多可以是100个值-100到100
我的方法是:生成两个数组的所有子序列,取它们的和,对于每个可能的和,将我们在数组A中找到的子序列的否与我们在数组B中找到的具有该和的子序列的否相乘。
这是非常低效的,因为生成的所有子序列都是O(2^100)
有人能帮我吗?我不需要代码,只是algo的想法会非常有用。
请注意,sum(X)或sum(Y)的范围是从-10000到10000
因此,如果将所有值存储在长度为20001的数组中,我们可以跟踪所有值。我们可以循环其中一个数组中的每个元素,跟踪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.),它将是新的和计数数组,为插入下一个元素做好准备。每个元素的复杂度为O(20001)
生成和计数数组的总体复杂度约为O(2*20001*100)<附加O(20001)以获得最终答案<所以总体复杂度是O(2*20001*100 20001)
您将得到一个包含正数和负数的数组。你要在数组中找到一个子数组,它等于某个值X。输入是数组和X值。输出是子数组的开始和结束索引。 例 下面是我在geeks4geeks上找到的代码
如何加快以下问题陈述的执行速度?我有一个正确的解决方案,通过每一个测试的小输入。但是,它超过了较大输入的时间限制。我当前的实现是数组大小的二次型。 你的答案应该是基于1的,这意味着数组的第一个位置是1而不是0。 实施
我想检查是否可以将一个数组拆分为具有相同和的连续子数组。拆分数组还意味着删除数组的边框元素。 例如,要将其拆分为3个部分,我们需要删除到元素 通过删除这2个元素,就有3个相同和的连续子数组,和。 因此,如果可以将数组拆分为3个部分(等和)并删除它们之间的边界,则应返回true,否则应返回false。 返回的示例是。因为删除2个元素后,它将有4个元素,这些元素不能分组为3个相等的和 我不知道如何处理
该问题给出了两个输入:数组(arr)和由数组构成子数组的次数(n)。子数组的和应该是奇数 已经很清楚,如果所有的数字都是偶数。奇数和子数组是不可能的。对于奇数和,连续的2个数字应该是奇数+偶数或者偶数+奇数。但我似乎不能把它们分成N个子数组。请帮忙解释一下逻辑。
我在一次采访中被问到这个问题。给定一个整数数组(具有正值和负值),我们需要找到具有相等总和的不相交子数组的最大数量。 例子: 输入:[1,2,3]输出:2{因为我们最多有2个子数组,总和=3,即[1,2],[3]} 输入: [2 2 2 -2] 输出 : 2 {两个子数组,每个子数组的总和 = 2,即 [2],[2, 2, -2]} 我的方法 我想到的第一种方法是找到前缀和数组,然后以每个元素(前
但是如何在O(n)中解决这个问题呢?