有一个整数数组(正数和负数)。请建议一个算法,它将为您提供最大总和的子阵列。 例如:
int a[] = new int[]{2,3,-1,4,5,7,8,13,-20};
然后答案应为{4,5,7,8,13}
4 + 5 + 7 + 8 + 13 = 37
。
我无法为此问题设计算法。
答案 0 :(得分:4)
以下是此问题的线性解决方案:
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;
}
这个算法背后的想法很简单:让我们来看看前缀和。然后答案是max(prefixSum[i] - prefixSum[j])
的最大值,其中j < i
为i
。这正是这段代码的作用:它迭代输入数组,保持当前前缀和和最小前缀总和,并选择最佳答案。
答案 1 :(得分:0)
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
答案 2 :(得分:-1)
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