当前位置: 首页 > 面试题库 >

长度为k的所有子数组的元素的乘积和

甘西岭
2023-03-14
问题内容

给出了长度为 n 的数组。查找子数组元素的乘积之和。

说明

数组 A* = 长度 3的 [2,3,4]*

长度为 2的 子数组= [2,3],[3,4],[2,4]

[2,3] 中元素的乘积= 6

[3,4] 中元素的乘积= 12

[2,4] 中元素的乘积= 8

长度 2 = 6 + 12 + 8 = 26的子数组的总和

同样,对于长度 3 ,Sum = 24

因此,乘积以模 1000000007 计算的子数组的长度可能更大。

找到所有可能长度(即1、2、3,......,n)的子数组的和的有效方法是什么,其中 n 是数组的长度。


问题答案:

我们首先创建一个递归关系。令f(n, k)为length的子数组与length k的数组a的所有乘积之和n。基本情况很简单:

f(0, k) = 0 for all k
f(n, 0) = 1 for all n

第二个规则似乎有点违反直觉,但是1是乘法的零元素。

现在我们找到的递归关系f(n+1, k)。我们想要size的所有子数组的乘积k。这里有两种类型的子数组:包含的子数组a[n+1]和不包含的子数组a[n+1]。不包括在内的总和a[n+1]就是f(n, k)。所包含a[n+1]的恰好是所有长度加k-1在一起的子数组a[n+1],因此它们的总和为a[n+1] * f(n, k-1)

这样就完成了我们的重复关系:

f(n, k) = 0                               if n = 0
        = 1                               if k = 0
        = f(n-1, k) + a[n] * f(n-1, k-1)  otherwise

您可以使用巧妙的技巧在动态编程中使用非常有限的内存,因为函数f仅取决于两个较早的值:

int[] compute(int[] a) {
    int N = a.length;
    int[] f = int[N];
    f[0] = 1;

    for (int n = 1; n < N; n++) {
        for (int k = n; k >= 1; k--) {
            f[k] = (f[k] + a[n] * f[k-1]) % 1000000007;
        }
    }

    return f;
}


 类似资料:
  • 给出了一个长度为n的数组。求子数组元素的乘积之和。 解释 长度为3的数组A=[2,3,4]。 因为,对于以模1000000007计算的较长的子数组,乘积可以更大。 对于所有可能长度的子数组,即1,2,3,....,n,求这些和的有效方法是什么,其中n是数组的长度。

  • 我有这个问题: 您将获得一个整数 A 和一个整数 k 的数组。您可以将 A 的元素递减到 k 次,目标是生成一个元素都相等的连续子数组。返回可以用这种方式生成的最长的连续子数组的长度。 例如,如果 A 是 [1,7,3,4,6,5] 并且 k 是 6,那么您可以生成 [1,7,3,4-1,6-1-1-1,5-1-1] = [1,7,3,3,3,3],因此您将返回 4。 最佳解决方案是什么?

  • 给定一个整数N和一个长度为N的数组,该数组由0到N-1的整数组成,可能包含也可能不包含所有整数,也可能包含重复数。查找一个从索引i到索引j的子数组(i, j),使其包含数组中的所有整数,并且具有最小长度。输出是这样一个子数组的长度 示例:A=[2,1,1,3,2,1,1,3],因此最小子数组长度=3,因为A[2]到A[4]包含所有数字 我的想法: 维护一个计数器数组和两个索引开始和结束,其中包含数

  • 给定一个数组,我想计算子数组的数量(连续的),当取的乘积不会被k整除。 例如。设 A = 和 K = 2 则使乘积不能被 K 整除的子数组数为 2: 其余的都可以被2整除。 我首先尝试计算子数组(n)(n 1)/2的总数,然后使用mod减去可被k整除的子数组的数量,但它不起作用。我该如何解决这个问题? 这(错误地)计算了乘积可被K整除的子阵列数: 一个稍微相关的问题是这个问题,但它涉及加法,因此不

  • 给定一个大小为n, n的数组

  • 本文向大家介绍LCM的最大长度子数组等于C ++中的乘积,包括了LCM的最大长度子数组等于C ++中的乘积的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个数组A。我们必须找到子数组的最大长度,它的LCM与该子数组元素的乘积相同。如果找不到这种子数组,则返回-1。假设数组为{6,10,21},则长度为2,因为在那里有子数组{10,21},其LCM为210,乘积也为210。 该方法是直接的。我