当前位置: 首页 > 知识库问答 >
问题:

如何找到给定长度的两个最大不相交子阵?

平航
2023-03-14

我需要写一个函数,把一个正整数数组a、一个正整数B和一个正整数C作为输入。然后,函数应该返回长度为B和C的两个不相交子数组a的元素的总和,这些元素的总和最大化这些总和。例如,如果A=[3,11,1,2,9,4,5,6,1],B=4和C=2,那么函数应该返回38。这是因为A的长度为B和C的两个最大的不相交子数组是[9,4,5,6]和[3,11]。第一个子阵列的元素之和是9+4+5+6=24,第二个子阵列的元素之和是3+11=14,所以两个子阵列的总和是38。

我写了一个函数,它html" target="_blank">循环a并找到a的所有长度为B的子数组和a的所有长度为C的子数组,然后找到最大的B长子数组的元素之和和最大的C长子数组的元素之和。一开始,我以为我可以把最大的c长子数组和最大的b长子数组加起来,找到38。但后来我意识到,我的函数并不确保B-long子数组和C-long子数组是不相交的,而是只找到A的长度分别为B和C的最大子数组,这是不够的。

它在上面的例子中有效,但是考虑下面的例子:A=[3,7,10,5,2,1,3,4],B=4,C=2。这里,只要找到最大的B长子数组和最大的C长子数组,就会得到[3,7,10,5]和[7,10]。然后函数将继续求和3+7+10+5=25和7+10=17,并返回38。但这是不行的,因为这两个子数组不是不相交的子数组。相反,函数应该返回[3,7,10,5]和[3,4]作为最大的B长和C长不相交子数组。然后它应该把元素加起来,得到32。换句话说,当长度为B和C的A的最大子数组重叠时,函数应该找到这样的B长子数组和C长子数组的组合,使元素的最终和最大化。这是我到目前为止的代码:

function solution(A, B, C) {
var groupB = [];
var sumgroupB;
var maxSumArrayB;
var valuesSumsBArray = [];
if (A.length < (B + C)) {
    return -1;
} else {
    for (var i = 0; i < A.length; i++) {
        if (i+B<=A.length) {
        groupB = A.slice(i, i+B);
        sumgroupB = groupB.reduce(function sum(a, b) { return a+b} );
        valuesSumsBArray.push(sumgroupB);
        }
    }
    maxSumArrayB = Math.max(...valuesSumsBArray);
}


var groupC = [];
var sumgroupC;
var maxSumArrayC;
var valuesSumsCArray = [];
if (A.length < (B + C)) {
    return -1;
} else {
    for (var i = 0; i < A.length; i++) {
        if (i+C<=A.length) {
        groupC = A.slice(i, i+C);
        sumgroupC = groupC.reduce(function sum(a, b) { return a+b} );
        valuesSumsCArray.push(sumgroupC);
        }
    }
    maxSumArrayC = Math.max(...valuesSumsCArray);
}

return [maxSumArrayB, maxSumArrayC];

}
console.log(solution([3, 11, 1, 2, 9, 4, 5, 6, 1], 4, 2)) 

我如何修正它以确保函数不求和A的最大B长和C长子数组的元素,而是求和不相交的最大B长和C长子数组的元素(这两个子数组使最终和最大化)?

共有1个答案

章阳波
2023-03-14
   function solution(A, B, C) {
     let max = -Infinity;

     for(let startB = 0; startB < A.length - B; startB++) {
       // C is before B
      for(let startC = 0; startC + C < startB; startC++) {
         const sum = [...A.slice(startC, startC + C), ...A.slice(startB, startB + B)].reduce((a, b) => a + b, 0);
         if(sum > max) max = sum;
      }
        // C is behind B
      for(let startC = startB + B; startC < A.length; startC++) {
         const sum = [...A.slice(startC, startC + C), ...A.slice(startB, startB + B)].reduce((a, b) => a + b, 0);
         if(sum > max) max = sum;
      }
    }

    return max;
  }
 类似资料:
  • 我试图解决的问题如下:我想在给定的数组中找到一个最大的数字跨度,该数组由正整数和负整数组成,返回最大值(a[j]-a[I]),这样1 求数组的n阶统计量的索引,使其为“i” 这个算法是O(nlogn),但我不知道它是否正确。

  • 当我尝试对BigInteger使用MAX_VALUE时,它给出>>ERROR>>找不到符号变量MAX_VALUE

  • 我从leet code https://leet code . com/problems/Maximum-Sum-of-Two-Non-Overlapping-Subarrays/中看到“两个非重叠子数组的最大和(特定给定长度,数组只包含正数)”。 但我遇到了这个问题的一个变体——“两个非重叠子数组(任意长度)的最大和,并且该数组包含正数和负数”。我看不到任何编码平台有这个问题需要我确认我的解决方

  • 我正在尝试使用递归函数打印列表,该列表具有由我的以下代码产生的列表的最大长度: 我需要将下面的输出传递给找到最大长度的递归函数: 基于我对这个问题答案的理解,我尝试使用以下代码来实现它,但我无法很好地实现递归部分。以下是我的尝试: 注:我需要使用递归来解决最长递增序列的问题。

  • 给定一个数组,你必须找到最大可能的两个相等的总和,你可以排除元素。 即给定数组,我们可以有最大两个相等的和,因为6 2=4 3 1 即 4,10,18, 22,我们可以得到两个相等的总和,因为 18 4 = 22 除了蛮力寻找所有计算并检查两个可能的相等和之外,你解决这个问题的方法是什么? 编辑1:数组元素的最大数目为N 编辑2:这是我的解决方案,https://ideone.com/cAbe4g

  • 所以我试着使用一个嵌套循环,将长度加到一个int数组中,然后遍历int数组,找到最大的数,但它没有通过测试用例,我开始想,也许我把这个问题复杂化了,有一个更简单的方法。这是我试过的。