Java 从包含最大和的整数数组中提取子数组的算法

Java 从包含最大和的整数数组中提取子数组的算法,java,javascript,c++,c,algorithm,Java,Javascript,C++,C,Algorithm,有一个整数数组(正整数和负整数)。请给出一个算法,该算法将为您提供最大和的子数组。 例如: 那么答案应该是{4,5,7,8,13}as4+5+7+8+13=37 我无法设计此问题的算法。以下是此问题的线性解决方案: var a = [2,3,-1,4,5,7,8,13,-20]; var positiveNums = a.filter(function(num){ return num > 0 }); // [2,3,4,5,7,8,13] var sum = positiveNum

有一个整数数组(正整数和负整数)。请给出一个算法,该算法将为您提供最大和的子数组。 例如:

那么答案应该是
{4,5,7,8,13}
as
4+5+7+8+13=37


我无法设计此问题的算法。

以下是此问题的线性解决方案:

var a = [2,3,-1,4,5,7,8,13,-20];
var positiveNums =  a.filter(function(num){
  return num > 0
}); // [2,3,4,5,7,8,13]
var sum = positiveNums.reduce(function(a, b){
  return a+b;
}); // 42
long getMaximumSubarraySum(int[] a) {
    int start = 0; 
    int end = 0;
    long result = 0; // I assume that an empty subarray is allowed.
    long minPrefixSum = 0;
    int minPrefixSumPos = -1;
    long currentPrefixSum = 0;
    for (int i = 0; i < a.length; i++) {
        currentPrefixSum += a[i];
        if (currentPrefixSum - minPrefixSum > result) {
             result = currentPrefixSum - minPrefixSum;
             start = minPrefixSumPos + 1;
             end = i + 1;
        }
        if (currentPrefixSum < minPrefixSum) {
             minPrefixSum = currentPrefixSum;
             minPrefixSumPos = i;
        }
    }
    // The resulting subarray is [start; end).
    return result;
}
long getMaximumSubraySum(int[]a){
int start=0;
int end=0;
long result=0;//我假设允许使用空子数组。
long minPrefixSum=0;
int minPrefixSumPos=-1;
长currentPrefixSum=0;
for(int i=0;iresult){
结果=currentPrefixSum-minPrefixSum;
start=minPrefixSumPos+1;
结束=i+1;
}
if(currentPrefixSum

这个算法背后的思想很简单:让我们来看看前缀和,然后答案是最大值<代码> max(PrimoSuth[i] -PrimoSuth[j]),其中

j
代表所有
i
。这正是这段代码的作用:它迭代输入数组,保持当前前缀和最小前缀和,并选择最佳答案。

几个月前,我已经解决了这个问题,所以我将向您提供算法。由您编写程序。

该程序的要点是,当你在数组中遇到负数时,求和会减少。因此,当这种情况发生时,你将数组分成3部分。
1)至今求和
2)至今求和+负数值(或如果有连续负数,则为值)
3)(2)+求和直到遇到另一个负数

给定这3个部分,选择具有最大值的部分并将其存储在变量中。此值成为下一次迭代的(1)。继续,直到到达数组末尾

下面是伪代码:

 do until end of array{
        b=compute_b() //Compute sum till you encounter negetive number
        c=compute_c() //Compute sum till you encounter a positive number
        a=max+b+c;
        if(a>c)
        {
             if(a>max)
             {
                      max=a;
             }
         }
         else
         {
              if(c>max)
              {
                    max=c;
              }
          }
    }
    print max

您是否试图从一定数量的数字中进行子集?如果没有额外的约束,这很简单。只需添加数组的所有正元素。如果没有正元素,则总和为0(空子集)或单个最大元素(1元素子集),具体取决于需求。但在这种情况下,不清楚为什么{2,3}从结果中排除。也许你的意思是有序数组的子序列?Jarlax:Assum of{2,3}是5。但是{4,5,7,8,13}的和是37和37>5。@PraveenKumar如果
a
被设置,{2,3,4,5,7,8,13}是最大和为42的有效子集。@PraveenKumar那么它是小注释。问题是如何检索子数组本身,而不是求和。此外,您的代码允许零长度子数组(这可能是可接受的,也可能是不可接受的)@Jarlax我修改了代码,这样它也可以找到子数组本身。零长度的子数组在这里看起来很自然,因为否则问题是:如果
A
为空,我们该怎么办?谢谢@Jarlax,因为我不知道最大子数组问题。如果可能的话,您可以提供更多具有类似问题的链接吗@PraveEnkuMar算法本身在维基百科上描述得很好。对于实践,你可以考虑下一个问题:,CUTE不是一个函数,它是一个数组,我的坏,也许这个修复会更好。
 do until end of array{
        b=compute_b() //Compute sum till you encounter negetive number
        c=compute_c() //Compute sum till you encounter a positive number
        a=max+b+c;
        if(a>c)
        {
             if(a>max)
             {
                      max=a;
             }
         }
         else
         {
              if(c>max)
              {
                    max=c;
              }
          }
    }
    print max