用于从包含最大求和的整数数组中提取子数组的算法
Algorithm for extracting a subarray out of an integer array, which contains the maximum summation
有一个整数数组(正整数和负数)。请建议一种算法,该算法将为您提供最大总和的子数组。例:
int a[] = new int[]{2,3,-1,4,5,7,8,13,-20};
那么答案应该是{4,5,7,8,13}
为4 + 5 + 7 + 8 + 13 = 37
.
我无法为此问题设计算法。
以下是此问题的线性解决方案:
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
。这正是此代码的作用:它遍历输入数组,维护当前前缀总和和最小前缀总和,并选择最佳答案。
几个月前我已经解决了这个问题,所以我将为您提供算法。由您编写程序。
该程序的要点是,当您在数组中遇到否定数字时,总和会减少。因此,当这种情况发生时,您将数组分为 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
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
相关文章:
- Regex提取URL返回数组的一部分;未定义”;
- 如何从合并的结果集中提取数组
- 如何从数组中提取对象
- 从多维数组javascript中提取特定值
- 从数组中提取特定信息
- 使用JavaScript在Json中提取时,将数组的元素转换为String
- 正在复制数组并提取
- 在Jquery中从JSON中提取数组值
- 如何将json文件中的数据提取到对象数组中,并在两个控制器之间共享
- 使用从forEach循环中提取的国家代码从数组中获取国家名称
- 如何在javascript中使用localStorage从数组中存储和提取数据
- 循环遍历数字和字母数组并仅提取数字
- 如何从..中提取信息..我称之为数组
- 如何从生成的JSON数组中提取JSON对象
- 在jquery中使用.split并从数组中提取第一个项
- 在提取dom对象后,无法将每个名为tab的元素推送到数组中
- 使用jsRender,如何使用有序位置以外的东西从数组中提取特定项
- 创建新的javascript数组,从对象属性中提取数据
- 从SQL中提取一个表来创建javascript数组
- Javascript数组提取重复到新的数组