如果我们不采取任何项目(所以解决方案是一个空子数组),我们有0
一个解决方案。这就是为什么规则是:
When running `sum` drops to `0` or below, restart summing.
一个有点棘手的时刻是在求和时遇到一个负数:
3, 4, 5, -1 ...
我们可以留下它(并拥有3 + 4 + 5 == 12
)或接受它,希望很快就会出现正数:
3, 4, 5, -1, 100, 200, 300
为了解决这种歧义,我们可以记住最好sum
的 aresult
并继续求和。C#实现:
private static double Solution(IEnumerable<double> source) {
// We can guarantee 0 (for empty subarray)
double result = 0;
double sum = 0;
// Linear: all we have to do is to scan the collection
foreach (var item in source)
if (sum + item <= 0) // when sum drops to zero
sum = 0; // ... restart summing
else {
sum += item;
if (sum > result) // update the best sum so far on each decision
result = sum;
}
return result;
}
测试:
// 6
Console.WriteLine(Solution(new double[] { -2, 1, -3, 4, -1, 2, 1, -5, 4 }));
// 20
Console.WriteLine(Solution(new double[] { -2, 11, -4, 13, -5, -3 }));